4

ソケットのプログラミング方法が混乱しているのかもしれませんが、このようなものは機能しないのでしょうか?

srv = TCPServer.open(3333)
client = srv.accept

data = ""
while (tmp = client.recv(10))
    data += tmp
end

クライアント TCPSocket からデータを「取得」する他のほとんどすべての方法を試しましたが、それらはすべてハングし、ループから抜け出すことはありません (getc、gets、read など)。何かを忘れているような気がします。私は何が欠けていますか?

4

3 に答える 3

8

サーバーを適切に作成するには、次のいずれかを行う必要があります。

  • 伝達されるデータの量を事前に知っておいてください。この場合、のread(size)代わりにメソッドを使用できますrecv(size)read合計バイト数が受信されるまでブロックします。
  • 終了シーケンスがあります:この場合recv、通信が終了したことを示すバイトのシーケンスを受信するまでループを続けます。
  • 通信が終了した後、クライアントにソケットを閉じてもらいます。この場合read、部分データまたは0でrecv戻り、0サイズのデータ​​で戻りますdata.empty?==true
  • select通信タイムアウトの定義:一定時間通信が行われなかった場合にタイムアウトを取得するためにこの関数を使用できます。この場合、ソケットを閉じて、すべてのデータが通信されたと想定します。

お役に立てれば。

于 2010-03-09T23:12:08.783 に答える
4

うーん、スタックオーバーフローでこれを続けています[自分の質問に答えます]。多分それは他の誰かを助けるでしょう。私がやろうとしていたことを行うためのより簡単な方法を見つけました:

srv = TCPServer.open(3333)
client = srv.accept

data = ""
recv_length = 56
while (tmp = client.recv(recv_length))
    data += tmp
    break if tmp.length < recv_length
end
于 2010-03-09T21:47:38.807 に答える