搞了一个星期还没搞出来,大家帮帮忙啊!
写一个多客服端聊天程序,在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()的话就不会出现阻塞
//怎么回事????
写一个多客服端聊天程序,在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()的话就不会出现阻塞
//怎么回事????
因为recv这个函数是会阻塞,只要没收到数据他就一直停在那里不会往下执行的.//是吗.你可以用一下select模型 或 WSAEventSelect模型等.
这样就可以不用一直在RECV接收数据了,
当有数据到来时,他们会有一个事件来触发.你就可以在那里recv数据了,//这个就不会一直阻塞了.
ioctlsocket(s_connect,FIONBIO,&cmd);
s_connect=accept(s,(SOCKADDR*)&addrClient,&lenClient);