用select管理套接字的状态,套接字可读的时候如何判断该SOCKET是可以接收数据,还是SOCKET关闭?
解决方案 »
- m_sHostName, 和m_sIPAddress是哪种数据类型,急,请指教!!!!!!!!!!!!!!!
- 关于CSpinButtonCtrl不能设置负数问题!
- 请教有关RichEdit的使用
- 请问怎样做出类似诺顿风格的界面?
- 请问:如何从dll中导出类和对象?
- 关于菜单资源问题,请指教
- editbox中怎么捕获键盘事件
- 再问:仍是那个问题
- 基于共享数据结构的通讯方式与基于共享存储区的通讯方式有何不同?数据结构是放在一个存储区上的呀。
- 关于ActiveX控件与Web脚本的问题
- 发现SDK的CREATEWINDOW有很大的问题(或许你用了很久却没有注意到)
- CoInitializeEx函数引起的问题
//#include "stdafx.h"
#include "winsock.h"
#include "io.h"
#include "stdlib.h"
#include <vector>using namespace std;#pragma comment(lib,"WSOCK32")int main(int argc, char* argv[])
{
int len;
char buff[255];
fd_set readfds;
memset(buff,0,sizeof(buff));
WSADATA wsdata;
WSAStartup(0x0202,&wsdata);
vector <SOCKET> SockList;
vector <SOCKET>::iterator Iter;
SOCKET ListenSocket,NewSocket;
sockaddr_in s_in,new_s_in;
s_in.sin_family = AF_INET;
s_in.sin_addr.s_addr = htonl(INADDR_ANY);
s_in.sin_port = htons(55555);
ListenSocket=socket(AF_INET,SOCK_STREAM,0);
if(ListenSocket==INVALID_SOCKET)
{
printf("\n Failed to setup socket!");
return 0;
} bind(ListenSocket,(struct sockaddr * )&s_in,sizeof(s_in)); listen(ListenSocket,5); printf("\n Waiting for client to connect..."); len=sizeof(new_s_in); FD_ZERO(&readfds);
FD_SET(ListenSocket, &readfds);
int nRet;
for (;;)
{ nRet = select(0, &readfds, NULL, NULL, NULL); // 判断监听套接字是否可读,如果可读,表示有连接请求
if (FD_ISSET(ListenSocket, &readfds))
{
NewSocket = accept(ListenSocket, (struct sockaddr *)&new_s_in,&len); if(SockList.size()==63)
{
printf("此次连接被拒绝\n");
closesocket(NewSocket);
continue;
} else
{ // 将套接字放入套接字容器 SockList.push_back(NewSocket);
} }
for(Iter=SockList.begin();Iter!=SockList.end();)
{
if(FD_ISSET(*Iter, &readfds))
{
nRet = recv(*Iter, buff, sizeof(buff), 0); if(nRet>0)
printf("\n %s", buff); // 输出接受到的数据
else
{
INT iError = ::WSAGetLastError();
if ((iError == WSAENETRESET ) ||
( iError == WSAECONNABORTED ) ||
( iError == WSAECONNRESET ) ||
( iError == WSAEINVAL ) ||
( nRet == 0 ) )
{ //表明客户端已经断开
closesocket(*Iter);
printf("\n Socket %d disconnect!",*Iter);
Iter=SockList.erase(Iter);
continue;
}
} }
Iter++;
} //更新套接字容器
FD_ZERO(&readfds);
FD_SET(ListenSocket, &readfds);
for(Iter=SockList.begin();Iter!=SockList.end();Iter++)
{
FD_SET(*Iter,&readfds);
}
} return 0;
}