send

sendは、アクセプトした相手のソケットにバイトデータを書き込むことで送信するUNIXシステムコール・・・。

Man page of SEND

前回は、相手から送られたきた文字列をサーバの標準出力に出力するだけだったが、
今回は、その文字列をsendを使って相手に送り返す・・・。

メッセージ処理のループで、

strcmpで"end"でない場合、読み込んだ文字列bufをprintfで出力した後、
bufに"\r\n"を再びつけて、sendにacc, buf, bufの長さなどを渡す・・・。
これでbufがクライアント側に送り返される・・・。

$ ./send
soc = 3
setsockopt(SO_REUSEADDR) success.
bind success.
listen success.

サーバはアクセプト待ち・・・。

$ telnet bgstation0.com 3000
Trying 27.120.97.162...
Connected to bgstation0.com.
Escape character is '^]'.

telnetで接続・・・。

$ telnet bgstation0.com 3000
Trying 27.120.97.162...
Connected to bgstation0.com.
Escape character is '^]'.
ABCDE

と"ABCDE"を入力してリターンを押すと、

$ telnet bgstation0.com 3000
Trying 27.120.97.162...
Connected to bgstation0.com.
Escape character is '^]'.
ABCDE
ABCDE

と"ABCDE"がもうひとつ出力された・・・。
これは、サーバから返されたものである・・・。

$ ./send
soc = 3
setsockopt(SO_REUSEADDR) success.
bind success.
listen success.
accept!(IPAddress = 27.120.97.162, Port = 40498)
ABCDE

サーバ側では"ABCDE"を受理しているからね・・・。

$ telnet bgstation0.com 3000
Trying 27.120.97.162...
Connected to bgstation0.com.
Escape character is '^]'.
ABCDE
ABCDE
end
Connection closed by foreign host.
$

"end"だと、向こうからは返って来ず、切断される・・・。

$ ./send
soc = 3
setsockopt(SO_REUSEADDR) success.
bind success.
listen success.
accept!(IPAddress = 27.120.97.162, Port = 40498)
ABCDE
$

サーバ側も終了している・・・。

Sample/send.c at master · bg1bgst333/Sample · GitHub