搞了一个星期还没搞出来,大家帮帮忙啊!
写一个多客服端聊天程序,在server端创建一个线程accept,然后将其置为非阻塞,
主线程recv然后send,但在recv处出现阻塞,怎么回事啊?
#include <winsock2.h>
#include <stdio.h>
#include <iostream.h>
#pragma comment(lib,"ws2_32.lib")
int flag=1;
unsigned long cmd;
SOCKET s,s_connect;
char buffer[100];
SOCKADDR_IN addrClient;
int lenClient=sizeof(SOCKADDR);
DWORD WINAPI ThreadProc(LPVOID lpParame){
while(1){
s_connect=accept(s,(SOCKADDR*)&addrClient,&lenClient);
    ioctlsocket(s_connect,FIONBIO,&cmd);
flag=0;
break;
}
return 0;
}
void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {                            
WSACleanup( );
return; 
}
SOCKADDR_IN addrSer;
int port=5000;
addrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(port);    s=socket(AF_INET,SOCK_STREAM,0);
bind(s,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));
listen(s,5);
    HANDLE m_hThreadRecv=::CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
while(flag){
Sleep(500);
}
recv(s_connect,buffer,sizeof(buffer),0);
cout<<success!<<endl;
return;
}
//已经在线程中把s_connect设为非阻塞状态了,怎么还在recv处阻塞?
//如果不创建线程只用一个main()的话就不会出现阻塞
//怎么回事????

解决方案 »

  1.   

    把ioctlsocket(s_connect,FIONBIO,&cmd); 拿到主线程来试试
      

  2.   

    "主线程recv然后send,但在recv处出现阻塞,怎么回事啊?"你没有用多线程又没有用winows socketIO模型,这样一定会阻塞的.
    因为recv这个函数是会阻塞,只要没收到数据他就一直停在那里不会往下执行的.//是吗.你可以用一下select模型 或 WSAEventSelect模型等.
    这样就可以不用一直在RECV接收数据了,
    当有数据到来时,他们会有一个事件来触发.你就可以在那里recv数据了,//这个就不会一直阻塞了. 
      

  3.   

    调整成如下顺序试试
    ioctlsocket(s_connect,FIONBIO,&cmd); 
    s_connect=accept(s,(SOCKADDR*)&addrClient,&lenClient); 
        
      

  4.   

    但是如果把accept和recv都写在main()函数里面,recv就不会阻塞,这是怎么回事