你要再仔细的看一下select模型的用法。你的代码写的好像有点问题,使用了fd_set,为何没有使用select??1.首先要注意的是,如果要监测是否连结成功,应当监测readset,而非writeset.
2.select函数执行后会返回一个int n,意义是可以去读有几个socket的数据(这里只是考虑readset)。
3.你需要使用FD_SET来判别每个socket是否在返回的readset中。如果在,且
如果该socket的值正好和你listen socket相同,说明有连结,否则读数据。并将n--,直到n = 0
2.select函数执行后会返回一个int n,意义是可以去读有几个socket的数据(这里只是考虑readset)。
3.你需要使用FD_SET来判别每个socket是否在返回的readset中。如果在,且
如果该socket的值正好和你listen socket相同,说明有连结,否则读数据。并将n--,直到n = 0
解决方案 »
- vc程序不能在双核电脑运行,高手帮帮忙
- vs2003 使用问题
- VC 打印问题,打印的内容里如何添加水印
- 用api编程怎样菜单颜色?
- MSDN for Visual Studio 6 的最新版本是哪一个版本啊?
- 发现侯sir深入浅出一书的bug, 今天查msdn发现ccommandlineinfo是从cobject派生的,而侯sir书前面的表说是not dirved form cobject
- 都说《vc内幕>>好,我看不见得
- 求助:MFC 多文档中如何打开对话框
- only attach once, detach on destroy
- 用哈弗曼编码压缩后得到的01比特流怎么存储最小
- KeyDown消息响应函数如何获得不同的键值
- 怎样定义并使用自定义消息?
select返回的是所有当前可以读写的的socket的数目(包括异常)。
{
sock[i]=socket(PF_INET,SOCK_STREAM,0);
ioctlsocket(sock[i], FIONBIO, (unsigned long*)&ul);//设成非阻塞模式 connect(sock[i],(struct sockaddr *)&sin,sizeof(SOCKADDR_IN));
sleep(1000);
FD_SET(sock[i], &fdswrite);
}
ret=select(maxfd+1, 0, &fdswrite, 0, &timeout);
那这样select()返回的ret会是多少呢,能不能根椐这个值来判断当前有多少socket已连接,其佘的不能连接呢
while(ret){if(FD_ISSET(sock[i],&setReadSet)){
if (sock[i] == nYourListenSocket){
accept(sock[i],....);
ret--;
}
}
{
cout<<VersionInfo<<endl; /////////////////listen port////////////////////////////
SOCKET nlistensocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(m_nListenPort);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if(bind(nlistensocket,(SOCKADDR*)&addr,sizeof(addr))){
cout<<"Bind listen port failed."<<endl;
return;
}
listen(nlistensocket,5);
cout<<"Listen client connect on port:"<<m_nListenPort<<endl; ///////////////////console port///////////////////////////
SOCKET nConsoleSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in addr1;
addr1.sin_family = AF_INET;
addr1.sin_port = htons(m_nConsolePort);
addr1.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if(bind(nConsoleSocket,(SOCKADDR*)&addr1,sizeof(addr1))){
cout<<"Bind listen port failed."<<endl;
return;
}
listen(nConsoleSocket,5);
cout<<"Listen Console connect on port:"<<m_nConsolePort<<endl; char buffer[1025]; //receive buffer space
struct timeval timeinterval;
timeinterval.tv_sec = 0;
timeinterval.tv_usec = m_lmSecond; cout<<"Now,let's go ! :)"<<endl<<endl;
while(1){
//set the readset
FD_ZERO(&m_setReadset);
FD_SET(nlistensocket,&m_setReadset);
FD_SET(nConsoleSocket,&m_setReadset);
m_mtemp = m_mSocket2Name;
SOCKET2ClientName_t ::iterator it;
for(it = m_mtemp.begin(); it != m_mtemp.end(); it++)
FD_SET((*it).first,&m_setReadset); m_mConsoletemp = m_mConsoleSocket;
SOCKET_t :: iterator consoleit;
for(consoleit = m_mConsoletemp.begin(); consoleit != m_mConsoletemp.end(); consoleit++)
FD_SET((*consoleit).first,&m_setReadset);
//now,let's find the socket! :)NULL);
int num = select(0,&m_setReadset,NULL,NULL,&timeinterval);
if(num <= 0 )
continue;
while(num > 0 ){
//client connect request
if(FD_ISSET(nlistensocket,&m_setReadset)){
sockaddr acceptaddr;
int nlen = sizeof(acceptaddr);
SOCKET s = accept(nlistensocket,&acceptaddr,&nlen);
if(s != SOCKET_ERROR){
this->OnNewConnection(s,(sockaddr*)&acceptaddr);
}else{
cout<<"accept error. error code:"<<WSAGetLastError()<<endl;
}
num--;
} //console connect
if(FD_ISSET(nConsoleSocket,&m_setReadset)){
sockaddr acceptaddr;
int nlen = sizeof(acceptaddr);
SOCKET s = accept(nConsoleSocket,&acceptaddr,&nlen);
if(s != SOCKET_ERROR){
Console_Welcome(s);
}
num--;
} //console command
for(consoleit = m_mConsoletemp.begin(); consoleit != m_mConsoletemp.end(); consoleit++){
if(FD_ISSET((*consoleit).first,&m_setReadset)){
int ret = recv((*consoleit).first,buffer,1024,0);
if(ret > 0){
buffer[ret] = '\0';
OnConsoleCommand((*consoleit).first,buffer);
}else{
Console_Disconnect((*consoleit).first);
}
num--;
}//if
}//for(consoleit //notify data coming
for(it = m_mtemp.begin(); it != m_mtemp.end(); it++){
if(FD_ISSET((*it).first,&m_setReadset)){//find the socket which receive data
int ret = recv((*it).first,buffer,1024,0);
if(ret > 0){
buffer[ret] = '\0';
OnDoWith((*it).first,buffer);
}else{
OnCloseConnection((*it).first);
}
num--;
}
}//for }//while(num > 0 )
}//while(1)
}