とあるホストに、TCP接続を張っては切るという処理をぐるんぐるん繰り返すベンチマーク的なプログラムを書いて動かしました。 最初のうちは期待した通りの動作をしてるんですが、途中から対向のホストにTCP接続できなくなってエラー出まくり。 $ netstat -tna | grep TIME_WAIT | wc -l 28230これが原因ぽい。 KERNEL_SOURCE/Documentation/networking/ip-sysctl.txt によれば、 ip_local_port_range - 2 INTEGERS Defines the local port range that is used by TCP and UDP to choose the local port. The first number is the first, the second the last loc
Why ZeroMQ? ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric
2.1 - ネット上で入手できるサンプルプログラムはありますか? はい。情報源のページにいくつか、ま た、FAQ の サンプルプログラムの章にもさ らにいくつかリストアップされています。まだ Winsock を始めたばかりであれば、 特に こちらの例が有用でしょう。 2.2 - WSAStartup 呼び出しの前に WSAData 構造体を初期化する必要はあるのですか? いいえ、WSAStartup() 自身が必要なデータを埋めてくれます。 2.3 - Winsock プログラムをコンパイルしようとするとリンクエラーが出ちゃいました。何が悪いんでしょう? おそらく、正しい Winsock インポートライブラリをリンクしていないのでしょ う。16bit の Windows システムでは、winsock.lib が正しいライブラリです。 32bit Windows システムで Winsock
connect(2) のエラー TCP において connect(2) 呼出し時に発生する可能性のあるエラーは以下の通りです。 タイムアウト RST 受信 EHOSTUNREACH また ENETUNREACH シグナル受信 その他 まず、connect(2) 時の正常な流れをしっかり覚えておいてください。 (connect(2) を呼んで) SYN を送る SYN+ACK が返ってくる (ここで connect(2) から戻る) ACK を送る タイムアウト もし仮に、SYN を送ったものの、相手側から SYN+ACK が返ってこない場合は、 (ローカルの TCP スタックが) しつこく SYN を再送します。何度 SYN を送っても SYN+ACK が返ってこない場合はあきらめてタイムアウトします。 「SYN+ACK が返ってこない」というのは、例えば以下のようなケースが考えられます。
raw TCP, UDP は Winsock 2 では直接操作できないことに気をつけ てください。その代わりに、IP_HDRINCL (raw IP とも言う)を使って、 IP と TCP, UDP の両方のヘッダを自分で作らなくてはなりませ ん。 Windows NT と Windows 2000 上では、管理者グループに属している ユーザしか raw ソケットをオープンすることができません。 4.2 - Winsock を使って LAN 上のパケットをキャプチャするにはどうすればよいのですか? Winsock では、無差別 IP パケットキャプチャ(プロミスキャスモー ド) は利用できません。生のパケットデータを得るには、Winsock を経 由せずに、トランスポートデータインターフェース(TDI)かネットワー クデバイスインタフェース仕様(NDIS)層と話をしなければなりません。 T
Previous Next Table of Contents 3. クライアントアプリケーションの作成 (TCP/SOCK_STREAM) 3.1 文字列をインターネットアドレスに変換するにはどうすれば良いのですか? もしホストのアドレスをコマンド行から読んでいるのであれば、それが aaa.bbb.ccc.ddd スタイルのアドレスであるか host.domain.com スタ イルのアドレスであるかを知ることはできないでしょう。私がこれに関 して行う方法は、まず aaa.bbb.ccc.ddd タイプのアドレスであるとし てそれを使おうとします。そして、それが失敗したら、名前の検索を行 います。以下に例を示します: /* アスキー文字列を in_addr 構造体に変換する。アドレスがみつから なかった場合には NULL が返される。 */ struct in_addr *atoaddr
Chapter 6. Handling many sockets at once using select() 6.5. Blocking vs. non-blocking sockets So far in this chapter, you've seen that select() can be used to detect when data is available to read from a socket. However, there are times when its useful to be able to call send(), recv(), connect(), accept(), etc without having to wait for the result. For example, let's say that you're writing a we
Boost C++ Libraries ...one of the most highly regarded and expertly designed C++ library projects in the world. — Herb Sutter and Andrei Alexandrescu, C++ Coding Standards This tutorial program shows how to use asio to implement a client application with TCP. We start by including the necessary header files. #include <array> #include <iostream> #include <boost/asio.hpp> The purpose of this applica
前述したTCPサーバ例では、サーバを終了した直後にもう一度サーバを起動しようとすると、bindがエラーで終了することがあります。 ここでは、その問題を回避するためにSO_REUSEADDRを有効にする方法を説明したいと思います。 TIME_WAIT TCPサーバのプログラムを書いていて、TCPサーバを終了して直後にもう一度起動したときに、 bindが「Address already in use」というようなエラーで失敗してしまったとこは無いでしょうか? 「あれ?もうTCPのサーバプロセスは終了しているのに。何故、bind出来ないのだろう?」と思いつつ、 しばらく時間がたってからもう一度実行すると問題なくbindが成功したりします。 この問題はTCP自体の仕組み(仕様)によって引き起こされています。(winsockの問題ではなく、TCPの仕様です)。 具体的にはTIME_WAIT状態という
【質問】 たまに、受信したレコードの最後が途中で切れていることがあります。どうしてでしょうか? 【回答】 SNA であればフレーム単位の伝送なのでこのようなことは起こりませんが、TCPIP はバイト単位で伝送を行います。 そのため、伝送中にレコードが複数のパケットに分割され、受信したバッファーにレコードの途中までしか入っていない事が あります。 つまり、400 バイトのレコードを send() し、400 バイトの Buffer 長を指定して recv() を行ったとしても、1回の recv() で、400 バイト全てのデータがとれる保証はありません。 800 バイトの Buffer 長を指定して recv() を行うと、2回分のレコードが1回の recv() で受信できるかもしれません。 固定長データの送受信ならば、受信したあとに足りないバイト数分の recv() を再度実行するようにコ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く