
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
RS-232Cでバイナリデータを受信...
-
WinsockAPIのrecvfromの受信デ...
-
Linuxでのシリアル通信について...
-
TCP/IP通信プログラミングにお...
-
「スイッチングハブのバッファ...
-
socket: recvはいつ,どれだけ...
-
rs232cでの受信データ(mscomm)...
-
SocketのSend関数でのCLOSEの検...
-
シリアル通信エラー
-
WriteFile()でのデータ送信がで...
-
UDP処理のエラーについて
-
winsockでソケット通信の開発を...
-
winsockの動作について。
-
Macターミナルで実行中のプログ...
-
VBSの処理中一旦処理を止めて再...
-
プロセスIDの取得方法について
-
DoEvents関数って何?
-
バックグラウンドのプロセスの...
-
プログラム上のCPU稼働率低減に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
「スイッチングハブのバッファ...
-
WriteFile()でのデータ送信がで...
-
socket: recvはいつ,どれだけ...
-
winsockでソケット通信の開発を...
-
RS-232Cでバイナリデータを受信...
-
SerialPortのDataReceivedイベ...
-
シリアル通信エラー
-
C#で通信処理。応答がない場合...
-
Linuxでのシリアル通信について...
-
シリアル通信の出力バッファと...
-
トラックバック機能を作りたい
-
ソケット通信内 read関数について
-
バイナリデータ受信時のデータ順
-
ReadFileについて
-
recv関数の受信結果について
-
visual c# 2010 シリアル通信ア...
-
ReadFile(GPSとの通信)Win7で...
-
popen実行時にバッファが空の場合
-
COMポートの同時オープン同時読...
おすすめ情報