ページ 11

UNIXでsocketプログラムのsend関数について

Posted: 2013年2月10日(日) 10:29
by sendMessageUser
ちょっとした疑問です。
UNIXのSOCKETプログラミングでsend関数の使い方について質問です。

関数の宣言は
int send( int socket, const void *msg, unsigned int msgLength, int flag );

第3引数の msgLength は 第2引数 msg の文字列長を指定するという意味だと記憶しているのですが、
仮に、
char msg[1024] = "hoge";
の場合、msgLengthは
sizeof(msg)にすべきなのか
strlen(msg)にすべきなのか
戸惑いました。
どちらがベストなのでしょうか。
それとも通信相手サイドのプログラム次第なのでしょうか。
あるいはsendの戻り値を把握して適切に処理したほうがいいのでしょうか。

それともうひとつ。
第4引数はとりあえず 0 を指定していますが、これについて詳しく書かれているサイトなど教えていただけると幸いです。

Re: UNIXでsocketプログラムのsend関数について

Posted: 2013年2月10日(日) 11:20
by softya(ソフト屋)
ちょっとした疑問というより、ちゃんと調べた方が良い疑問ですね。
第4引数にも意味があります。
「Man page of SEND」
http://linuxjm.sourceforge.jp/html/LDP_ ... end.2.html
Linux/Unixならmanで調べるとか上記サイトで調べるのは基本といって良いので調べるようにしましょう。

第3引数は、文字列の長さというよりデータ長です。strlen(msg)で送った場合は文字列終端が含まれないので困るんじゃなかいと思いますよ。

Re: UNIXでsocketプログラムのsend関数について

Posted: 2013年2月10日(日) 12:58
by sendMessageUser
そうですね。
Linux/Unixならmanで調べられるのを忘れていました。

本件だと通信相手がJavaでreadLineで受信していたため、strlenでも送信側の末尾に\n\0があれば大丈夫という事がわかりました。
(sizeofだと\0以降のゴミも送ってしまうため、受信サイズを通信双方で約束していないといけないですよね)

第4引数についてはまた勉強します。