wsaevent

来源:互联网 发布:网络贷款有多少人不还 编辑:程序博客网 时间:2024/06/05 07:11
#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 libraryif (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 socketclosesocket(SI->socket);// Free socket heap memoryHeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, SI);// close eventWSACloseEvent(eventArr[index]);//merge arrayfor ( i = index; i < dwTotal; ++i){socketArr[i] = socketArr[ i + 1 ];eventArr[i] = eventArr[ i + 1 ];}}

0 0
原创粉丝点击