wsaevent

16 篇文章 0 订阅
#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 ];
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值