[ create a new paste ] login | about

Link: http://codepad.org/NEXG3Ssh    [ raw code | fork ]

C++, pasted on Dec 3:
int main()
{
	StartWinsock();
	cout << "Winsock initiated\n";
	//Get the number of processors
	DWORD ulProcessors = GetNumberOfProcessors();
	cout << "Number of Processors/Threads, that will be used: " << ulProcessors << endl;
	//Create an completion port
	hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, ulProcessors);
	if(hCompletionPort == NULL)
		ErrorAbort("Could not create completion port");
	cout << "Completion Port created\n";

	//Create threads
	CreateThreads(ulProcessors);
	cout << "Threads created\n";

	//Create socket
	AcceptorSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	addrinfo *final, hints;
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_INET;
	hints.ai_flags = AI_PASSIVE;
	if(getaddrinfo(NULL,"12345", &hints, &final))
		ErrorAbort("Could not retrieve address information");
	if(bind(AcceptorSock,final->ai_addr, final->ai_addrlen))
		ErrorAbort("Could not bind socket");
	freeaddrinfo(final);
	cout << "Acceptor socket created and bound\nStarting to listen on the acceptor socket\n";
	if(listen(AcceptorSock, 2))
		ErrorAbort("CanĀ“t listen on the socket");

	//Add acceptor socket file handle to be observed by the completion port
	if(CreateIoCompletionPort((HANDLE)AcceptorSock, hCompletionPort, NEW_CONNECTION, 0) != hCompletionPort)
		ErrorAbort("A new completion port has been created instead of using the existing one");
	cout << "Acceptor socket associated with the completion port\n";

	ResumeThreads(2);
	char lpOutputBuf[1024];
	int outBufLen = 1024;
	DWORD dwBytes;
	OVERLAPPED over;
	SOCKET newSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


	while(true)
	{
		memset(&over, 0, sizeof(over));
		if(AcceptEx(AcceptorSock, newSock, lpOutputBuf, outBufLen - ((sizeof(sockaddr_in) + 16) * 2), sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16, &dwBytes, &over) == FALSE)
		{
			int x = WSAGetLastError();
			if( x != WSA_IO_PENDING)
				ErrorAbort("Could not acceptex a new connection");
		}
	}

	//Cleanup
	CloseHandle(hCompletionPort);
	cin.get();
	return 0;
}


Create a new paste based on this one


Comments: