1

ssize_t send(int sockfd, const void *buf, size_t len, int flags);ファイルから使用していsocket.hます。私はそれについていくつかの疑問を持っています。

疑問 1 : 渡す文字列sendの長10さが であり、3 番目のパラメーターで指定された長さが であるとします15。次に、send10文字のみを送信するか、15文字を送信します(最後の5文字の未割り当てメモリを読み取ることで取得します)。
逆の場合は、2 番目のパラメーターの長さが 3 番目のパラメーターよりも長い場合に発生します。

疑問 2 : 2 番目のパラメーターの長さが 3 番目のパラメーターと等しいと仮定しています。2番目のパラメータが言うなら - "abc\0def\0qw"。その長さは 11 です。send文字列全体を送信する\0か、その効果のいずれかを持ちます。文字列全体を送信すると思います。実際に送信する方法。

これらの機能について詳しく説明している についての良い情報源を誰かが知っている場合はsendrecv共有してください。

4

3 に答える 3

2
  • この関数sendは、指定したとおりに正確に送信しようとします。バッファーが十分に大きい場合、特別なことは何も起こりません。そうでない場合、何が起こるかは定義されていません。ガベージを送信したり、クラッシュしたり、他のことをしたりする可能性があります

  • 関数sendはバッファの内容を気にしません - 指定された書き込みバイト数だけを気にします

于 2012-09-13T18:16:56.167 に答える
1

sendは、NUL で終わる文字列について何も知りません (パラメーターの型に手がかりがあります -void*ではなく を使用しますchar*)。

指定したアドレスから、指定したバイト数を送信するだけです。それが未割り当てメモリの読み取りを意味する場合は、それが実行され、プロセスでクラッシュする可能性があります。

于 2012-09-13T18:16:45.223 に答える
1

関数はsend「文字列」について何も知りません。ポインタを与えて、そのポインタの後に次の 15 バイトを送信するように指示すると、まさにそれが実行しようとします。(不適切な値を指定すると、 Seg-Faultなどに遭遇する可能性がありlenます)。

value を持つバイトが見つかったからといって、停止すると信じる正当な理由はありません0x00。結局のところ、多くのネットワーク プロトコルがいたるところにあふれてい0x00ます。sendその値を見つけるたびに停止することはできません。

于 2012-09-13T18:18:24.393 に答える