UDP Echo Server
C 言語で書いてみた。というか、TCP/IPソケットプログラミングC言語編の内容をほとんどコピーしているに近いのだが。
#include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> void die_with_error(char *errorMessage) { perror(errorMessage); exit(1); } int main(int argc, char* args[]){ if( argc != 2 ){ fprintf(stderr, "Usage: %s $LISTEN_PORT\n", args[0]); exit(1); } int sock; struct sockaddr_in serverAddr; struct sockaddr_in clientAddr; unsigned int clientAddrLength; char echoBuffer[255]; unsigned short serverPort; int receivedMessageSize; serverPort = atoi(args[1]); sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if( sock < 0 ){ die_with_error("socket() failed\n"); } memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(serverPort); int bindResult = bind(sock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); if( bindResult < 0 ){ die_with_error("bind() failed\n"); } printf("Waiting client connected...\n"); for( ;; ) { memset(echoBuffer, 0, sizeof(echoBuffer)); clientAddrLength = sizeof(clientAddr); receivedMessageSize = recvfrom(sock, echoBuffer, sizeof(echoBuffer), 0, (struct sockaddr *)&clientAddr, &clientAddrLength); if( receivedMessageSize < 0 ){ die_with_error("recvfrom() error\n"); } printf("Client connected, %s\n", inet_ntoa(clientAddr.sin_addr)); printf("%s\n", echoBuffer); } close(sock); return 0; }
とりあえず、これをコンパイルして以下のように起動。
$ ./udp-echo-server 7001 Waiting client connected...
この状態で、netcat を使ってUDPでデータ送信。
$ echo "Hey" | nc -u 127.0.0.1 7001
サーバー側には Hey と表示された。とりあえずサーバーの実装はよさそう。次はクライアントを書いてみる。