procedure TForm1.Server3;
var
  s,newsock:TSocket;
  addrs:TSockAddrIn;
  addrc:PSockAddr;
  leng:Integer;
  wsa:WSAData;
  wVersionRequested:WORD;
  buf:array[0..128]of char;
  buf2:array[0..128]of char;
begin
  wVersionRequested := MAKEWORD( 2, 0 );
  WSAStartup(wVersionRequested,wsa);  s := socket(AF_INET,SOCK_STREAM,0);
  Memo1.Lines.Add('Create Socket Succeed');  addrs.sin_family := AF_INET;
  addrs.sin_addr.S_addr := htonl(INADDR_ANY);
  addrs.sin_port := htons(12000);  bind(s,addrs,sizeof(addrs));
  Memo1.Lines.Add('Bind Socket Succeed');
  listen(s,1);
  Memo1.Lines.Add('Listen Socket Succeed');
  while 1>0 do
  begin
    leng:= sizeof(addrc);
    newsock := accept(s,addrc,@leng);
    if newsock >= 0 then
      Memo1.Lines.Add('Accept Socket='+ InttoStr(newsock)+ 'succeed!');
    if recv(newsock,buf,sizeof(buf),0)>0 then
    begin
        Form1.Memo1.Lines.Add(buf2);
        strcopy(buf2,PChar(form1.Edit1.Text));
        send(newsock,buf2,sizeof(buf2),0);
    end;
    closesocket(newsock);
  end;  Closesocket(s);
  WSACleanup();
  sleep(2000);
end;在代码 newsock := accept(s,addrc,@leng);处为何没有阻塞等到客户端的连接?请高手指点。谢谢!

解决方案 »

  1.   

    阻塞个毛
    accept 如果有远程的连接请求则建立连接,
    如果没有则返回0
    为什么会阻塞?
      

  2.   

    accept 是个阻塞函数,如果不放在 while 1>0 do内就阻塞了,如果在其内就不阻塞。
      

  3.   

    >>如果不放在 while 1>0 do内就阻塞了,如果在其内就不阻塞亏你想得出来 阻塞和位置有关系吗?  while 1>0 do
      begin
        leng:= sizeof(addrc);
        newsock := accept(s,addrc,@leng);
        if newsock <> INVALID_SOCKET then
           Memo1.Lines.Add('Accept Socket='+ InttoStr(newsock)+ 'succeed!') else
           Memo1.Lines.Add('i am a pig!');
            closesocket(newsock);
      end;
    看看结果
      

  4.   

    soft8848(菜鸟) 妳說話很搞笑﹐哈哈....
      

  5.   

    addrs:TSockAddrIn; 改为TSockAddr