1

新しいタグを作成できないため、この投稿は誤って「送信」とタグ付けされています。

この単純なエコー サーバーについて非常に基本的な質問があります。いくつかのコード スニペットを次に示します。

クライアント

while True:
 data = raw_input("Enter data: ")
 mySock.sendall(data)
 echoedData = mySock.recv(1024)
 if not echoedData: break
 print echoedData

サーバ

while True:
 print "Waiting for connection"
 (clientSock, address) = serverSock.accept()
 print "Entering read loop"
 while True:
     print "Waiting for data"
     data = clientSock.recv(1024)
     if not data: break
     clientSock.send(data)
 clientSock.close()

これで問題なく動作しますが、クライアントが空の文字列を送信する場合 ("enter data: " に応答してリターン キーを押す) を除きます。この場合、デッドロックのような動作が見られます。

では、ユーザーがクライアント側で return キーを押すと、正確には何が起こるのでしょうか? いくつかのデータが送信バッファーに追加されるのを待っている sendall 呼び出しがブロックされ、recv 呼び出しがブロックされることしか想像できません。何が起きてる?

読んでくれてありがとう!

4

1 に答える 1

4

同様に、sendall()(送信するデータがないため) 呼び出しは何も実行せず、クライアントrecv()での呼び出しはデータを待機してブロックされますが、サーバーには何も送信されていないため、サーバーもブロックされているため、サーバーはデータを返信しません。 initialであるため、両方のプロセスがブロックされます。recv()

于 2010-03-31T01:14:43.103 に答える