ソケット通信プログラミングでよく使用するURLなどをまとめる。
manページ
クイックリファレンス(サーバ編)
凡例 最もよく見る記述
- 第1引数の一言説明
- 第2引数の一言説明
- 戻り値の一言説明
sock = socket(AF_UNIX, SOCK_STREAM, 0);
AF_UNIX
: プロセス間通信用ソケット。他にはAF_INET
/AF_VSOCK
などが入る。SOCK_STREAM
: データ境界の概念がないストリームはコレ。そうでなければSOCK_SEQPACKET
。0
: 9割方使わないsock
: 失敗すると-1でerrnoを設定。
ret = bind(sock, (const struct sockaddr *) &addr, sizeof(addr));
sock
:socket
の返したもの。addr
:sockaddr_un
構造体を指定。#include <sys/un.h>
必要。sizeof(addr)
: サイズ。ret
: 成功で0、失敗で-1
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, path);
unlink(path);
if (bind(listenfd, (const struct sockaddr *) &addr, sizeof(addr)) < 0) {
perror("bind");
return -1;
}
構造体はこんな感じである。
ret = listen(sock, 10);
sock
:socket
が返してbind()
済みのもの。10
: backlogの数。accept
せずにためておける接続数。
fd = accept(sock, NULL, NULL);
sock
:socket
が返してbind()
/listen()
済みのもの。NULL
×2 : 1個目はaddr, 2個目はsizeを示す、クライアントが設定するsockaddr
構造体。見る必要がなければ両方NULL
。fd
: クライアントのfd
。失敗は-1でerrno設定。
ret = recv(fd, buf, sizeof(buf), 0);
fd
:accept()
が返却のもの。buf
/sizeof(buf)
: 受信バッファ。- 0 : フラグ。
MSG_DONTWAIT
/MSG_WAITALL
などを指定。 ret
: 受信したバイト数。負値はエラー、0はクライアントが切断されたことを意味する。
ret = send(fd, buf, len, 0);
fd
:accept()
が返却のもの。buf
/len
: 送信バッファ。- 0 : フラグ。
MSG_DONTWAIT
などを指定。 ret
: 成功0、失敗-1。errno == ECONNRESET
はクライアントが切断されたことを意味する。
クイックチェック(サーバ編)
前提
- 2クライアント以上を受け付ける場合は
fork() /
pthread_create()による並列実行か
poll()`による多重化が必要です。 - 1クライアントの場合でも切断前に新たなクライアントを受け付ける(
accept()
)際は上記が必要です。 - したがって「サーバ」と呼べるほとんどの実装ではマルチスレッドや多重化が必要になります。
チェック項目
というような背景からソケットプログラミング(特にサーバ)では多重化とマルチスレッドが必須となりどっちをやった場合でも抜け漏れが生じやすいです。
- 多重化のための
poll()
でaccept()
の発火を検知するためにsock
そのものを入れ忘れていませんか? accept()
したfd
を捨てていませんか?(クライアントが疎通できなくなる)recv()
の戻り値でクライアントの切断判定を行っていますか?send()
の戻り値でクライアントの切断判定を行っていますか?
おまけ:recv
/send
とread
/write
の違いは何ですか?
第4引数のflagsを使わないかつSOCK_STREAM
であれば違いありません。ただしread
/write
のmanページからクライアントの切断判定を読み取るのは難しいでしょう。またSOCK_SEQPACKET
などは違いがあります。あきらめてrecv
/send
を使用しましょう。
クイックリファレンス(クライアント編)
テストするためのプログラムであれば作成不要。
echo world | nc -q 0 -U socket
のような感じでsocket
に文字を送信できる。-q 0
を指定しないと切断せずにブロックしてしまうのでつけたほうが使いやすい。