windows tcp server select

#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
fd_set socketSet;
SOCKET sockSrv;
//accept thread
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
cout << "enter in socket check" << endl;
char buf[1024];
while (1)//检测socket网络事件,判断是否有连接和数据读取
{
fd_set    readSet = socketSet;
int   nRetAll = select(0, &readSet, NULL, NULL, NULL);
if (0 < nRetAll)
{
for (int i = 0; i < socketSet.fd_count; i++)//检查是否有数据读取和socket断开
{
if (sockSrv == socketSet.fd_array[i])
{
continue;
}
if (FD_ISSET(socketSet.fd_array[i], &readSet))
{
int nRecv = recv(socketSet.fd_array[i], buf, 1024, 0);
if (0 < nRecv)//有数据接收
{
buf[nRecv] = '\0';
cout << socketSet.fd_array[i] << " socket recv len:"  << nRecv <<  " data:" << buf << endl;
}
else//网络断开
{
cout << "socket disconnect:" << socketSet.fd_array[i] << endl;
closesocket(socketSet.fd_array[i]);
FD_CLR(socketSet.fd_array[i], &socketSet);
}
}
}
if (FD_ISSET(sockSrv, &readSet))//有新连接请求
{
sockaddr_in addrRemote;
int nAddrLen = sizeof(addrRemote);
SOCKET sClient = accept(sockSrv, (sockaddr*)&addrRemote, &nAddrLen);
if (sClient != INVALID_SOCKET)
{
FD_SET(sClient, &socketSet);
cout << "recv a new connect:" << sClient << endl;
}
}
}
}
return 0;
}
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);//SDK这个宏创建一个无符号16位整形,通过连接两个给定的无符号参数。表示1.1版本
err = WSAStartup(wVersionRequested, &wsaData);//通过WSAStartup函数完成对Winsock服务的初始化,调用socket必须初始化
if (err != 0) {
cout << "socket init failed"<< endl;
return 0;
}
cout << "socket init ok!" << endl;
sockSrv = socket(AF_INET, SOCK_STREAM, 0);//建立本地流式套接字
cout << "socket fd:" << sockSrv << endl;
SOCKADDR_IN addrSrv;//TCP/IP的地址信息
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;//TCP指定的
addrSrv.sin_port = htons(8888);//端口号
err = bind(sockSrv, (sockaddr*)&addrSrv, sizeof(SOCKADDR));//绑定套接字
if (0 != err) {
cout << "socket bind failed" << endl;
return 0;
}
err = listen(sockSrv, 5);//#####监听本地套接字
if (0 != err) {
cout << "socket listen failed" << endl;
return 0;
}
FD_ZERO(&socketSet);
FD_SET(sockSrv, &socketSet);
DWORD threadID;
HANDLE hThread;
hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &threadID); // 创建线程
while (1) {
//SOCKADDR_IN addrClient;
//int len = sizeof(SOCKADDR);
//SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);//接受链接等待客户端链接,返回客户套接字
Sleep(1000);
}
getchar();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/larkin/p/11279949.html