Advertisement

Is my Winsock Asynchronous socket setup properly for listening?

Started by August 19, 2004 03:47 AM
0 comments, last by Pipo DeClown 20 years, 6 months ago
Hi, Im using winsock asynchronous sockets. So far I've set it up listening. But I am not sure if this is right. Could you tell me if I got my code in the right places? Thanks WM_USER+1 is what I have assigned the asynchronous socket to. //start listening button

SOCKET s, client[3];
int number_of_clients;
void CHostDlg::OnButtonHostgameStartListening() 
{
	number_of_clients=0;
	s = socket (AF_INET, SOCK_STREAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons (5001);
	addr.sin_addr.s_addr = htonl (INADDR_ANY);
	if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
	{
		MessageBox("Winsock failed to bind port", "Error");
		WSACleanup ();
	}

	if (listen(s,3)==SOCKET_ERROR)
	{ 
		MessageBox("Winsock failed to start listening", "Error");
		WSACleanup ();
		editConnectionStatus->SetWindowText("Disconnected");
	}

	WSAAsyncSelect(s, GetSafeHwnd(), WM_USER+1, FD_WRITE | FD_CONNECT | FD_READ | FD_CLOSE);

}




//disconnect

void CHostDlg::OnButtonHostgameCloseConnections() 
{
	shutdown (s, SD_SEND);  
	closesocket (s);  
}





//message handler, handles connection accepts

LRESULT CHostDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch( message ) 
	{ 
		case WM_USER+1:
			if (WSAGETSELECTERROR(lParam))
			{
				WSACleanup ();
				return 0;
			}

			switch (WSAGETSELECTEVENT(lParam))
			{
				case FD_ACCEPT:
				   while (number_of_clients < MAX_CLIENTS)
					{
						client[number_of_clients] = accept (s, client_sock[number_of_clients], &addr_size); 
						if (client[number_of_clients] == INVALID_SOCKET)
						{
							WSACleanup ();
							return 0;
						}
						else
						{ 
							number_of_clients++;
						}
					} 
					
					break;
				case FD_READ:
					break;
				case FD_CONNECT:
					break;
				case FD_CLOSE:
					break;
				default:
					break;
			}
		break;
	}
	return CDialog::WindowProc(message, wParam, lParam);
}






[Edited by - johnnyBravo on August 19, 2004 7:24:09 AM]
I think creating a non-blocking server is much easier. I haven't compared the results though, only the code.

GDNet Article on Non-Blocking servers, this article is great.

This topic is closed to new replies.

Advertisement