Shammer's Philosophy

My private adversaria

UDP Echo Client

サーバーを書いてみたので、次はクライアント。

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>

void die_with_error(char *errorMessage) {
    perror(errorMessage);
    exit(1);
}

int main(int argc, char* args[]) {
    if ( argc != 4 ){
	printf("Usage: %s $SERVER_LISTEN_IP $SERVER_LISTEN_PORT $MESSAGE\n", args[0]);
	exit(1);
    }
    int sock;
    int port = atoi(args[2]);
    if( port <= 0 || 65535 < port ){
	die_with_error("Invalid port range.\n");
    }
    struct sockaddr_in addr;
    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr(args[1]);
    sendto(sock, args[3], strlen(args[3]), 0, (struct sockaddr *)&addr, sizeof(addr));
    close(sock);
    return 0;
}

以下のように実行する。

$ ./a.out 127.0.0.1 9999 Hello

実行結果等は何も出さずに終わってしまうが。とりあえず、UDP Echo Server - Shammerismで作成したサーバーへメッセージを送信することはできた。

UDP の場合は、TCP と違い connect 関数を使用せずにメッセージと一緒に宛先情報を指定して送信するのが一般的なようだ。