
No.4ベストアンサー
- 回答日時:
>>内部の領域は"250 OK220 OK\0"となるのでしょうか?
通常、socket通信は、送信するバイト列をバイナリとしてそのまま送信するので、'\0'を最後に送信していれば、上記のようになるでしょうし、送ってなければ、'\0'は届かないですね。Cの文字列のような'\0'が文字列の終わりのような役割は無いです。もしそうであれば、intやlongのデータをそのままでは送れないことになってしまいます。
そして通常は構造体を丸ごと送信するケースが多いようです。
ただ、「そのまま送る」といっても、例えば100bytesを1回でsendしたとき、「100bytesのパケットが飛ぶ」とは限りません。100bytesを1回でrecvしたり、50bytesが2回、またちょっと考えにくいのですが、1byteを100回recvするということになるかもしれません。
socketはパケットというよりも、「ダラダラと続くバイト列が適当に切られてrecvされる」と考えたほうがいいと思います。
>>ここで220から読むには読み捨てが必要になるのでしょうか?
ネットワークのエラー等で再送されたデータなど、ほんとにいらないデータなら読み捨てですが、処理に必要なデータなら処理します。通常は、先頭に長さデータの情報を付加したり、データ内に出現しないコードを区切り文字として、受信したバイト列を、送信時のパケットあるいは1レコードとして復元させます。たとえば、"250 OK220 OK"のデータなら、基本的に6バイト読んで1レコードという処理を2回することになります。
実際の処理では、通信経路上のノイズや処理遅延などでデータ欠落が発生したりするため、シーケンスNoなどで、受信したレコードが正しいか確認する処理を行います。
注:実際には、ネットに流すデータはバイトオーダも考慮してください。
No.3
- 回答日時:
OS側でrecv()でメモリリークが起きるかどうかはOSの問題です。
いづれにせよ、このような単純なメモリ管理方式はとっていません。
>1.実行分だけたまる
>2.最後の実行が上書きされる。
少なくとも、UNIX系OSに関しては、recv/sendなどソケット系システムコールでメモリリークは起こりません。
というか、「OS内部でどうメモリを使っているかアプリケーションプログラマが考えて、メモリリークを起こさないように気をつけてプログラミングする」というのはWindowsなど腐れたOSの話です。ソケットAPIではそのような制約はありません。受け取ったパケットをrecvで取り出さなければある程度までメモリ消費量が膨らみますが、いずれにせよcloseした時点ですべて元に戻ります。
No.2
- 回答日時:
send,recv関数で行うソケット通信は、OSで送受信用バッファが用意されます。
これに余裕がある間は、送信受信が行われますが、一杯になれば、バッファに空きができるまで停止します。また、ネットワークにデータを流す送受信の単位は、TCPパケットの送受信の最適化をするため、1バイトずつ送ったとしても、受信側に1バイト単位で届くということはないようです。それから、受信分が貯まった場合の問題は、空きが無くなるメモリーパンク状態で、メモリーリークではないですね。
もし、ゴミデータだと判別できるなら、読み捨てをやればいいと思いますし、この処理が必要なケースはよくあると思います。
この回答への補足
やはり読み捨てでしょうか?
例えば、
1回目が「250 OK」で2回目が「220 OK」だとして、
内部の領域は"250 OK220 OK\0"となるのでしょうか?
recvで最初に3バイト取得すると、次は250のスペースからに
なりますか?
ここで220から読むには読み捨てが必要になるのでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 病院・検査 健診直後、病院から連絡が来たのですが、、。 20代女です。 転職したので先週の土曜日に雇入れ健診を受 1 2022/11/07 23:48
- その他(メールソフト・メールサービス) メールソフトからの送信ができなくなりました 6 2022/11/21 19:35
- 訴訟・裁判 医師の意見書を貰う場合、請求するのは医師本人でしょうか?それとも診察をした病院になりますか? 3年ほ 1 2022/11/28 00:56
- 労働相談 有給休暇使用時の賃金の計算方法について 5 2022/04/04 00:02
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- その他(プログラミング・Web制作) pythonの「関数の関数」の実例として、「関数を引数で受け取り、微分した結果の関数を返す関数」と書 3 2022/06/04 18:07
- その他(ニュース・時事問題) 旧統一教会信者が地方議会に対して「特定教団との関係を断つ様なことをするな」との陳情書を多数送付。 2 2022/12/15 15:29
- 政治 少数派を大切に? 5 2022/09/24 09:57
- 郵便・宅配 マンションなどの宅配ボックスの利用方法について 4 2023/03/17 21:47
- その他(IT・Webサービス) [PayPay銀行キャッシュカード拾得の件] このメールは本物か? 6 2022/09/15 21:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OpenGLで陰面消去処理をデプス...
-
visual c# 2010 シリアル通信ア...
-
C#でDBにデータを送るプログラ...
-
ラズパイで、ウェブから、ウェ...
-
rs232cでの受信データ(mscomm)...
-
mscommの受信バッファ異常について
-
Macターミナルで実行中のプログ...
-
遠方界のプログラム
-
コールバック関数について
-
Ofの使い方
-
携帯の環境変数の取り扱い
-
wsdlからのサービス化を行い。
-
PIC16F84Aから16F628Aの...
-
メッセージボックスの表示につ...
-
プロセスに表示されないソフト...
-
秋月PICプログラマーを使っ...
-
通信ゲームを作りたいんですが
-
COMについて
-
JPGからSWFへ変換
-
Visual Basic Net2003
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
「スイッチングハブのバッファ...
-
winsockでソケット通信の開発を...
-
シリアル通信の出力バッファと...
-
WriteFile()でのデータ送信がで...
-
Linuxでのシリアル通信について...
-
WinsockAPIのrecvfromの受信デ...
-
socket: recvはいつ,どれだけ...
-
SerialPortのDataReceivedイベ...
-
ClearCommError呼び出し時のCE_...
-
TCPでの非同期型select関数につ...
-
シリアルポート通信
-
シリアル通信 大きいサイズの...
-
winsockの動作について。
-
ソケット通信内 read関数について
-
COMポートの同時オープン同時読...
-
SocketのSend関数でのCLOSEの検...
-
waveIn、waveOutでの音声録音・...
-
write関数でEAGAINのエラー発生...
-
rs232cでの受信データ(mscomm)...
おすすめ情報