69,382
社区成员
发帖
与我相关
我的任务
分享
//////////////////////////////////////////////////////
// select.cpp文件
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
class InitWinSock
{
public:
InitWinSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(::WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~InitWinSock()
{
::WSACleanup();
}
};
#include <windows.h>
#include <process.h>
InitWinSock theSock;
FD_SET g_fdRead;
FD_SET g_allSet; //全集
SOCKET g_sListen;
unsigned long _stdcall ThreadFun(void*)
{
while(1)
{
g_fdRead=g_allSet;
timeval timeval;
timeval.tv_sec=0;
timeval.tv_usec=0;
int nRet = ::select(0, &g_fdRead, NULL, NULL, &timeval);
printf("%d\n",nRet);
if(nRet<=0)
{
Sleep(500);
continue;
}
//检测是否有新连接,或者有数据传输
if(FD_ISSET(g_sListen,&g_allSet))
{
SOCKET stmp=NULL;
sockaddr_in sockadd;
int nLen=sizeof(sockaddr_in);
stmp=accept(g_sListen,(sockaddr*)&sockadd,&nLen);
FD_SET(stmp,&g_allSet);
}
//可以运行到for 循环中!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(int i=0;i< g_fdRead.fd_count;i++)
{
if(FD_ISSET(g_fdRead.fd_array[i],&g_allSet))
{
SOCKET stmp=NULL;
sockaddr_in sockadd;
int nLen=sizeof(sockaddr_in);
char buf[200];
ZeroMemory(buf,sizeof(buf));
recv(g_fdRead.fd_array[i],buf,sizeof(buf),0);
printf("接受数据为:%s\n",buf);
}
}
Sleep(500);
} //end while
return 0;
}
int main()
{
USHORT nPort = 9585; // 此服务器监听的端口号
// 创建监听套节字
g_sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定套节字到本地机器
if(::bind(g_sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf(" Failed bind() \n");
return -1;
}
// 进入监听模式
::listen(g_sListen, 5);
FD_ZERO(&g_allSet);
FD_ZERO(&g_fdRead);
FD_SET(g_sListen,&g_allSet);
// HANDLE hThread=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,NULL);
HANDLE hThread=CreateThread(NULL,0,ThreadFun,0,0,NULL);
WaitForSingleObject(hThread,-1);
CloseHandle(hThread);
return 0;
}