// author: frenchwhale (http://frenchwhales_site.tripod.com) // for the WinSock tutorial // // file name: wsserver.c // // description: A TCP server that uses Winsock to // listen for connections, receives data, // and answers with a pre-specified message // Copyright 2002 frenchwhale #define MESSAGE "Hello, Client!\n" #include #include #include #include int main(int argc, int **argv) { WSADATA wsda; // Structure to store information returned from // WSAStartup char szRepMessage[80]; // Store the reply message int iMessageLen; int ret; // Return values char szInBuffer[128]; int iBufferLen; int iPort, iAddrLen; SOCKET sListen, sClient; // Our TCP socket handle SOCKADDR_IN addr, // The local interface remote_addr; // The address of the connecting host // Check arguments if(argc != 2 || (argc==2 && strcmp((char *) &argv[1][0], "/?")==0)) { printf("wsserver port\n"); printf(" port: the listening port\n"); exit(1); } // Get the remote port iPort = atoi((char *) &argv[1][0]); if(iPort<0 || iPort>65563) // 0 < iPort < 65563 { printf("Invalid port number! (%s)\n", argv[2]); exit(1); } strcpy(szRepMessage, MESSAGE); iMessageLen = strlen(szRepMessage); // Load version 1.1 of Winsock WSAStartup(MAKEWORD(1,1), &wsda); // Create a TCP socket printf("Creating socket..."); sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); // Error? if(sListen == SOCKET_ERROR) { printf("Error\nCall to socket(AF_INET, SOCK_STREAM, IPPROTO_IP); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("OK\n"); printf("Binding socket to port %d...", iPort); addr.sin_family = AF_INET; addr.sin_port = htons(iPort); addr.sin_addr.s_addr = htonl(INADDR_ANY); // Listen on any interface ret = bind(sListen, (struct sockaddr *) &addr, sizeof(addr)); // Error? if(ret == SOCKET_ERROR) { printf("Error\nCall to bind(sListen, (struct sockaddr *) &addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("OK\n"); printf("Putting socket into listening mode..."); ret = listen(sListen, 10); // Backlog 10 // Error? if(ret == SOCKET_ERROR) { printf("Error\nCall to listen(sListen, 10); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("OK\n"); printf("Waiting for connections (Press Ctrl-C to exit)..."); iAddrLen = sizeof(remote_addr); sClient = accept(sListen, (struct sockaddr *) &remote_addr, &iAddrLen); // Error? if(sClient == SOCKET_ERROR) { printf("Error\nCall to accept(sListen, (struct sockaddr *) remote_addr, sizeof(remote_addr)); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("%s connected\n", inet_ntoa(remote_addr.sin_addr)); // Receive data printf("Waiting for a response..."); ret = recv(sClient, szInBuffer, sizeof(szInBuffer), 0); if(ret == SOCKET_ERROR) { printf("Error\nCall to recv(sClient, szInBuffer, sizeof(szInBuffer), 0); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("Response recieved\n"); iBufferLen = ret; // recv() returns the number of bytes read szInBuffer[iBufferLen] = '\0'; // convert to cstring printf("Data recieved:\n%s\n", szInBuffer); // Ready to send data printf("Sending reply..."); ret = send(sClient, szRepMessage, iMessageLen, 0); if(ret == SOCKET_ERROR) { printf("Error\nCall to send(sClient, szRepMessage, iMessageLen, 0) failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("OK\n"); printf("Closing client socket..."); closesocket(sClient); printf("OK\n"); return 0; }