winsock 问题 请教xianguo ( 积分: 15 )

  • 主题发起人 主题发起人 subcom
  • 开始时间 开始时间
S

subcom

Unregistered / Unconfirmed
GUEST, unregistred user!
xianguo你让我下载的是WINSOCK2。我的程序是用WINSOCK写的。就是无法接收数据。请问它和WINSOCK有什么区别吗?以下是原代码敬请指教
var
sock,len,msgsock:integer;
//sock,length,,rval,err:integer;
buf:array[0..1023]of char;
wVersionRequested:WORD;
wsaData:TWSADATA;
server:TSockAddrIn;
i,err:integer;
addr:pchar;
size:integer;

procedure Trec.Execute;
var x:char;
begin
sleep(100);
with form1 do begin
{ }
{wVersionRequested:=MAKEWORD(2,0);
err:=WSAStartup(wVersionRequested,wsaData);
if err<>0 then
Label1.Caption:='初始化失败!'}
if WSAStartup($0101, wsaData)<>0 then
begin
showmessage('不能初始化Winsock!');
Exit;
end
else begin
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if sock=INVALID_SOCKET then
Label1.Caption:='创建套接口失败!'
else begin
server.sin_family:=AF_INET;
server.sin_port:=htons(2000);
server.sin_addr.s_addr:=inet_addr(Pchar(edit2.Text));;
if bind(sock,server,sizeof(server))<>0 then
Label1.Caption:='绑定套接口失败!';
len:=sizeof(server);
//getsockname(sock,server,len);
if listen(sock,5)<>0 then
Label1.Caption:='侦听失败!';
if accept(sock,@server,@len)=INVALID_SOCKET then
Label1.Caption:='接受失败!';
size:=1024;
i:=recv(sock,buf,size,MSG_OOB);
if i<>0 then
Label1.Caption:='接收失败!';
end
end
end;
{ Place thread code here }
end;
 
xianguo你让我下载的是WINSOCK2。我的程序是用WINSOCK写的。就是无法接收数据。请问它和WINSOCK有什么区别吗?以下是原代码敬请指教
var
sock,len,msgsock:integer;
//sock,length,,rval,err:integer;
buf:array[0..1023]of char;
wVersionRequested:WORD;
wsaData:TWSADATA;
server:TSockAddrIn;
i,err:integer;
addr:pchar;
size:integer;

procedure Trec.Execute;
var x:char;
begin
sleep(100);
with form1 do begin
{ }
{wVersionRequested:=MAKEWORD(2,0);
err:=WSAStartup(wVersionRequested,wsaData);
if err<>0 then
Label1.Caption:='初始化失败!'}
if WSAStartup($0101, wsaData)<>0 then
begin
showmessage('不能初始化Winsock!');
Exit;
end
else begin
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if sock=INVALID_SOCKET then
Label1.Caption:='创建套接口失败!'
else begin
server.sin_family:=AF_INET;
server.sin_port:=htons(2000);
server.sin_addr.s_addr:=inet_addr(Pchar(edit2.Text));;
if bind(sock,server,sizeof(server))<>0 then
Label1.Caption:='绑定套接口失败!';
len:=sizeof(server);
//getsockname(sock,server,len);
if listen(sock,5)<>0 then
Label1.Caption:='侦听失败!';
if accept(sock,@server,@len)=INVALID_SOCKET then
Label1.Caption:='接受失败!';
size:=1024;
i:=recv(sock,buf,size,MSG_OOB);
if i<>0 then
Label1.Caption:='接收失败!';
end
end
end;
{ Place thread code here }
end;
 
WINSOCK2是Windows Socket 2版(WSAStartup($202, WSAData);)
你用的是1.1($0101)版(WSAStartup($0101, wsaData))
 
麻烦你帮我看一下。我上面的程序为什么不能接受啊?谢谢!
 
ding yi xia
 
在上面的代码中你犯了两个严重的错误:
1,接收连接只有在由连接请求才能接收连接,也就是说你的accept(sock,@server,@len)调用时机不对。判断何时由连接请求需要判断侦听SOCKET是否由数据可读,你可以通过循检(调用select)来判断,你也可以通过消息或者事件来判断(你需要调用相应的socket API)。
2,接收数据的recv(sock,buf,size,MSG_OOB)其中的sock参数应是accept函数返回的socket句柄。还有,不是调用recv函数就能接收到数据的,这里就涉及到当前能不能收到数据。
建议你先了解一下socket io模式。
 
接受答案了.
 
后退
顶部