64,687
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include "InitSocket.h"
#pragma comment (lib,"ws2_32.lib")
//初始化网络环境
CInitSocket gcInitSocket;
void main()
{
SOCKET sServer = socket(AF_INET,SOCK_STREAM,0);
if (INVALID_SOCKET == sServer)
{
printf("创建服务器套接字失败,错误编号:%d\n",WSAGetLastError());
exit(0);
}
sockaddr_in addrBind;
addrBind.sin_family = AF_INET;
addrBind.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
addrBind.sin_port = htons(8080);
int iBind = bind(sServer,(sockaddr*)&addrBind,sizeof(sockaddr));
if (SOCKET_ERROR == iBind)
{
printf("bind failed\n");
exit(0);
}
int iListen = listen(sServer,SOMAXCONN);
if (SOCKET_ERROR == iListen)
{
printf("listen failed\n");
exit(0);
}
WSAEVENT eventArr[WSA_MAXIMUM_WAIT_EVENTS];
SOCKET socketArr[WSA_MAXIMUM_WAIT_EVENTS];
int iArrSize = 0;
WSAEVENT eventForSRV = WSACreateEvent();
eventArr[iArrSize] = eventForSRV;
socketArr[iArrSize] = sServer;
++iArrSize;
if (WSA_INVALID_EVENT == eventForSRV)
{
printf("create wsaevent failed\n");
exit(0);
}
WSAEventSelect(sServer,eventForSRV,FD_ACCEPT | FD_CLOSE);
while (1)
{
int iIndex = WSAWaitForMultipleEvents(iArrSize,eventArr,false,INFINITE,false);
if (WSA_WAIT_FAILED == iIndex || WSA_WAIT_TIMEOUT == iIndex)
{
continue;
}
iIndex -= WSA_WAIT_EVENT_0;
for (int i = iIndex;i!=iArrSize;++i)
{
iIndex = WSAWaitForMultipleEvents(1,&eventArr[i],true,1000,false);
if (WSA_WAIT_FAILED == iIndex || WSA_WAIT_TIMEOUT == iIndex)
{
continue;
}
else
{
WSANETWORKEVENTS eventTmp;
WSAEnumNetworkEvents(socketArr[i],eventArr[i],&eventTmp);
if (eventTmp.lNetworkEvents & FD_ACCEPT)
{
if (eventTmp.iErrorCode[FD_ACCEPT_BIT] != 0)
{
continue;
}
sockaddr_in addrAccept;
int iLength = sizeof(sockaddr);
SOCKET sAccept = accept(socketArr[i],(sockaddr*)&addrAccept,&iLength);
WSAEVENT eventAccept = WSACreateEvent();
printf("IP:%s,端口:%d\n",inet_ntoa(addrAccept.sin_addr),ntohs(addrAccept.sin_port));
WSAEventSelect(sAccept,eventAccept,FD_READ || FD_WRITE || FD_CLOSE);
socketArr[iArrSize] = sAccept;
eventArr[iArrSize] = eventAccept;
++iArrSize;
}
else if (eventTmp.lNetworkEvents & FD_READ)
{
if (0 != eventTmp.iErrorCode[FD_READ_BIT])
{
continue;
}
char chRecv[200] = {0};
int iRecv = recv(socketArr[i],chRecv,200,0);
if (SOCKET_ERROR == iRecv)
{
printf("recv failed\n");
continue;
}
printf("%s\n",chRecv);
}
else if (eventTmp.lNetworkEvents & FD_CLOSE)
{
// if (0 != eventTmp.iErrorCode[FD_CLOSE_BIT])
// {
// continue;
// }
closesocket(socketArr[i]);
for (int i2 = i;i2!=iArrSize - 1;++i2)
{
socketArr[i] = socketArr[i + 1];
eventArr[i] = eventArr[i + 1];
}
--iArrSize;
printf("one client closed\n");
}
}
}
}
}