#include "common.h"
BOOL CreateSocketInformation(SOCKET s);
void FreeSocketInformation(DWORD index);
int main()
{
WSADATA wsaData;
WORD dwVersion(MAKEWORD(2,2));
SOCKET sListen, sClient;
SOCKADDR_IN addrServer;
WSANETWORKEVENTS netWorkEvents;
DWORD dwEvent;
DWORD flg(0);
DWORD dwByteRecv(0), dwByteSend(0);
// init socket library
if (WSAStartup(dwVersion, &wsaData) != 0)
{
OutErr("Failed to init socket information");
return -1;
}
// 2. 创建服务器端套接字
if((sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
OutErr("create socket error");
return -1;
}
if (CreateSocketInformation(sListen) == FALSE )
{
OutErr("create socket information failed");
return -1;
}
if (WSAEventSelect(sListen, eventArr[dwTotal-1], FD_ACCEPT | FD_CLOSE) == SOCKET_ERROR)
{
OutErr("WSAEventSelect() select failed");
return(-1);
}
// 3. 绑定套接字到指定的端口
addrServer.sin_addr.s_addr= htonl(ADDR_ANY);
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(PORT);
if( (bind(sListen, (PSOCKADDR)&addrServer, sizeof(SOCKADDR_IN))) == SOCKET_ERROR)
{
OutErr("bind() failed with error!");
return (-1);
}
listen(sListen, 5);
while(TRUE)
{
if( (dwEvent = WSAWaitForMultipleEvents(dwTotal, eventArr, FALSE, WSA_INFINITE, FALSE)) == WSA_WAIT_FAILED )
{
OutErr("bind() failed with error!");
break;
}
dwEvent = dwEvent - WSA_WAIT_EVENT_0;
if( WSAEnumNetworkEvents(socketArr[dwEvent]->socket, eventArr[dwEvent], &netWorkEvents) == SOCKET_ERROR )
{
OutErr("WSAEnumNetworkEvents() failed");
break;
}
if (netWorkEvents.lNetworkEvents & FD_ACCEPT )
{
if( netWorkEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
{
printf("FD_ACCEPT_BIT error: %d\n", FD_ACCEPT_BIT);
break;
}
if ( (sClient = accept(socketArr[dwEvent]->socket, 0, 0)) == INVALID_SOCKET)
{
OutErr("accept() client failed");
closesocket(socketArr[dwEvent]->socket);
break;
}
CreateSocketInformation(sClient);
if (WSAEventSelect(sClient, eventArr[dwTotal -1], FD_READ | FD_WRITE | FD_CLOSE) == SOCKET_ERROR)
{
OutErr("WSAEventSelect() select failed");
break;
}
printf("socket %d connected\n", sClient);
}
if ( (netWorkEvents.lNetworkEvents & FD_READ) || (netWorkEvents.lNetworkEvents & FD_WRITE))
{
if(netWorkEvents.lNetworkEvents & FD_READ &&
netWorkEvents.iErrorCode[FD_READ_BIT] != 0)
{
printf("FD_READ failed with error %d\n", netWorkEvents.iErrorCode[FD_READ_BIT]);
break;
}
if(netWorkEvents.lNetworkEvents & FD_WRITE &&
netWorkEvents.iErrorCode[FD_WRITE_BIT] != 0)
{
printf("FD_WRITE failed with error %d\n", netWorkEvents.iErrorCode[FD_WRITE_BIT]);
break;
}
LPSOCKETINFORMATION socketInfo = socketArr[dwEvent];
if (socketInfo->dwByteRecv == 0)
{
socketInfo->wsaBuf.buf = socketInfo->dataBuf;
socketInfo->wsaBuf.len = MSGSIZE;
flg = 0;
if (WSARecv(socketInfo->socket, &(socketInfo->wsaBuf), 1, &(dwByteRecv), &flg, NULL, NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
OutErr(" recv() failed");
return -1;
}
}
else
{
socketInfo->dwByteRecv = dwByteRecv;
OutMsg(socketInfo->dataBuf);
}
}
if (socketInfo->dwByteRecv > socketInfo->dwByteSend)
{
socketInfo->wsaBuf.buf = socketInfo->dataBuf + socketInfo->dwByteSend;
socketInfo->wsaBuf.len = socketInfo->dwByteRecv + socketInfo->dwByteSend;
flg = 0;
if ((WSASend(socketInfo->socket, &(socketInfo->wsaBuf), 1, &dwByteSend, flg, NULL, NULL)) == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
printf("WSASend() failed with error %d\n", WSAGetLastError());
FreeSocketInformation(dwEvent - WSA_WAIT_EVENT_0);
break;
}
}
else
{
socketInfo->dwByteSend += dwByteSend;
if (socketInfo->dwByteRecv == socketInfo->dwByteSend)
{
socketInfo->dwByteRecv = 0;
socketInfo->dwByteSend = 0;
}
}
}
if (netWorkEvents.lNetworkEvents & FD_CLOSE)
{
if (netWorkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
{
printf("FD_CLOSE failed with error %d\n", netWorkEvents.iErrorCode[FD_CLOSE_BIT]);
//break;
}
printf("closing socket information %d\n", socketArr[dwEvent - WSA_WAIT_EVENT_0]->socket);
FreeSocketInformation(dwEvent- WSA_WAIT_EVENT_0);
}
}
}
return 0;
}
BOOL CreateSocketInformation(SOCKET s)
{
LPSOCKETINFORMATION SI = (LPSOCKETINFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SOCKET_INFORMATION));
if (SI == NULL)
{
OutErr("HeapAlloc() failed");
return FALSE;
}
SI->socket = s;
SI->dwByteRecv = 0;
SI->dwByteSend = 0;
memset(SI->dataBuf, 0, sizeof(SI->dataBuf));
socketArr[dwTotal] = SI;
if ( (eventArr[dwTotal] = WSACreateEvent()) == WSA_INVALID_EVENT)
{
OutErr("WSACreateEvent() failed");
return FALSE;
}
dwTotal++;
return TRUE;
}
void FreeSocketInformation(DWORD index)
{
unsigned int i(0);
LPSOCKETINFORMATION SI = socketArr[index];
// close socket
closesocket(SI->socket);
// Free socket heap memory
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, SI);
// close event
WSACloseEvent(eventArr[index]);
//merge array
for ( i = index; i < dwTotal; ++i)
{
socketArr[i] = socketArr[ i + 1 ];
eventArr[i] = eventArr[ i + 1 ];
}
}
wsaevent
最新推荐文章于 2021-11-24 23:13:10 发布