accept(2)の第二引数addr 引き数は sockaddr 構造体へのポインタ。この構造体には接続相手のソケットのアドレスが入っている。構造体ポインタから接続元情報を表示することで接続相手が何者かを識別できる。
以下は最小限のサンプル。tcpサーバとしての役目と接続元を表示する。
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sock0; struct sockaddr_in addr; struct sockaddr_in client; int len; int sock; sock0 = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = INADDR_ANY; bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); listen(sock0, 5); while (1) { len = sizeof(client); sock = accept(sock0, (struct sockaddr *)&client, &len); printf("accepted connection from %s, port=%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); } }
ちなみにaddr が NULL の場合、 addr には何も入らない。簡易TCPサーバとして接続元使ってなんかしたいってことはあまり無い気がするので(やるならちゃんとしたOSSでやる気がする)あんま使わなそうなオプション。