// author: frenchwhale (http://frenchwhales_site.tripod.com) // for the WinSock tutorial // // file name: wsudprcv.c // // description: A UDP packet receiver that waits for // UDP packets on a specific port // Copyright 2002 frenchwhale #include #include #include #include int main(int argc, int **argv) { WSADATA wsda; // Structure to store info // returned from WSAStartup char szMessage[512]; int iMessageLen; int ret; char szAddress[64]; int iPort; SOCKET s; // Our TCP socket handle SOCKADDR_IN addr, // The local interface address remote_addr; // The sender's address int iRemoteAddrLen; // Contains the length of remte_addr, passed to recvfrom // Check arguments if(argc != 2 || (argc==2 && strcmp((char *) &argv[1][0], "/?")==0)) { printf("wsudprcv port\n"); printf(" port: the port the server should listen to\n"); exit(1); } // Get the remote port iPort = atoi((char *) &argv[1][0]); if(iPort<0 || iPort>65563) { printf("Invalid port number! (%s)\n", argv[2]); exit(1); } iMessageLen = 512; // Set to the length of szMessage buffer // Load version 1.1 of Winsock WSAStartup(MAKEWORD(1,1), &wsda); // Create an UDP socket printf("Creating socket..."); s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Error? if(s == SOCKET_ERROR) { printf("Error\nCall to socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("OK\n"); // Fill in the interface information printf("Binding socket..."); addr.sin_family = AF_INET; addr.sin_port = htons(iPort); addr.sin_addr.s_addr = INADDR_ANY; if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR) { printf("Error\nCall to bind(s, (struct sockaddr *) &addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("OK\n"); // Ready to receive data printf("Waiting for packets (Press Ctrl-C to exit)..."); iRemoteAddrLen = sizeof(remote_addr); ret = recvfrom(s, szMessage, iMessageLen, 0, (struct sockaddr *) &remote_addr, &iRemoteAddrLen); if(ret == SOCKET_ERROR) { printf("Error\nCall to recvfrom(s, szMessage, iMessageLen, 0, (struct sockaddr *) &remote_addr, &iRemoteAddrLen); failed with:\n%d\n", WSAGetLastError()); exit(1); } printf("Packet received\n"); iMessageLen = ret; // Length of the data received szMessage[iMessageLen] = '\0'; // Convert to cstring printf("\"%s\" received from %s\n", szMessage, inet_ntoa(remote_addr.sin_addr)); closesocket(s); WSACleanup(); return 0; }