No.2
- 回答日時:
send,recv関数で行うソケット通信は、OSで送受信用バッファが用意されます。
これに余裕がある間は、送信受信が行われますが、一杯になれば、バッファに空きができるまで停止します。また、ネットワークにデータを流す送受信の単位は、TCPパケットの送受信の最適化をするため、1バイトずつ送ったとしても、受信側に1バイト単位で届くということはないようです。それから、受信分が貯まった場合の問題は、空きが無くなるメモリーパンク状態で、メモリーリークではないですね。
もし、ゴミデータだと判別できるなら、読み捨てをやればいいと思いますし、この処理が必要なケースはよくあると思います。
この回答への補足
やはり読み捨てでしょうか?
例えば、
1回目が「250 OK」で2回目が「220 OK」だとして、
内部の領域は"250 OK220 OK\0"となるのでしょうか?
recvで最初に3バイト取得すると、次は250のスペースからに
なりますか?
ここで220から読むには読み捨てが必要になるのでしょうか?
よろしくお願いします。
No.3
- 回答日時:
OS側でrecv()でメモリリークが起きるかどうかはOSの問題です。
いづれにせよ、このような単純なメモリ管理方式はとっていません。
>1.実行分だけたまる
>2.最後の実行が上書きされる。
少なくとも、UNIX系OSに関しては、recv/sendなどソケット系システムコールでメモリリークは起こりません。
というか、「OS内部でどうメモリを使っているかアプリケーションプログラマが考えて、メモリリークを起こさないように気をつけてプログラミングする」というのはWindowsなど腐れたOSの話です。ソケットAPIではそのような制約はありません。受け取ったパケットをrecvで取り出さなければある程度までメモリ消費量が膨らみますが、いずれにせよcloseした時点ですべて元に戻ります。
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などで、受信したレコードが正しいか確認する処理を行います。
注:実際には、ネットに流すデータはバイトオーダも考慮してください。
お探しの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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ソケットのrecvの戻り値が0
C言語・C++・C#
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
recv関数の戻り値について
C言語・C++・C#
-
-
4
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
5
send-recvで複数データの送受信
C言語・C++・C#
-
6
ファイルやディレクトリの存在確認を行う方法
C言語・C++・C#
-
7
TCP/IP のパケットの分断と結合について
UNIX・Linux
-
8
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
9
Connectエラーが出てしまう・・・。
C言語・C++・C#
-
10
fopne で失敗する原因
C言語・C++・C#
-
11
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
12
エディットボックスの入力制限について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
winsockでソケット通信の開発を...
-
socket: recvはいつ,どれだけ...
-
UDP処理のエラーについて
-
「スイッチングハブのバッファ...
-
SerialPortのDataReceivedイベ...
-
VB2005でWin32APIを用いてRS-23...
-
ClearCommError呼び出し時のCE_...
-
Linuxでのシリアル通信について...
-
SocketのSend関数でのCLOSEの検...
-
バイナリデータ受信時のデータ順
-
シリアルポート通信
-
TCP/IP通信プログラミングにお...
-
rs232cでの受信データ(mscomm)...
-
C#で通信処理。応答がない場合...
-
RS232C通信のC言語プログラム:...
-
WriteFile()でのデータ送信がで...
-
メールを数日後に自動返信
-
recv関数の受信結果について
-
シリアル通信の出力バッファと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
「スイッチングハブのバッファ...
-
socket: recvはいつ,どれだけ...
-
シリアル通信の出力バッファと...
-
Connection reset by peer
-
RS232C通信(PC⇔PLC)
-
RS-232Cでバイナリデータを受信...
-
WaitForMultipleObjects関数の...
-
Linuxでのシリアル通信について...
-
rs232cでの受信データ(mscomm)...
-
UDP処理のエラーについて
-
SocketのSend関数でのCLOSEの検...
-
ソケット通信内 read関数について
-
recv関数の受信結果について
-
シリアルポート通信
-
MSCommでoutputできない
-
SerialPortのDataReceivedイベ...
-
VB2005でWin32APIを用いてRS-23...
おすすめ情報