Python:socket.recvfrom()アドレスにnoneを返す -- python フィールド と sockets フィールド 関連 問題

Python: socket.recvfrom() returning none for address












4
vote

問題

日本語

例のここにある。ただし、クライアントとサーバーの両方で作成したrecvfrom()への呼び出しごとに、 address 。私が考えることができる唯一のことは、ソケットがストリームソケットであるという事実と関係があるかもしれませんが、タイプを socket.SOCK_DGRAM に変更しようとしたとき、私は私の呼び出しにエラーが発生しました。 <コード> socket.listen() 。この問題を解決できますか?

<事前> <コード> def server(port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('127.0.0.1', port)) sock.listen(5) clientsocket, address = sock.accept() kkp = KnockKnockProtocol(); #Class which implements knock knock outputLine = kkp.processInput(); clientsocket.sendto(outputLine, address) inputLine, address = clientsocket.recvfrom(MAX_BYTES) while inputLine: print inputLine, address outputLine = kkp.processInput(inputLine); clientsocket.sendto(outputLine, address) if outputLine == "Bye.": break inputLine, address = clientsocket.recvfrom(MAX_BYTES) def client(port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("127.0.0.1", port)) fromServer, address = sock.recvfrom(MAX_BYTES) while fromServer: print "Server: " + fromServer if fromServer == "Bye.": break fromUser = raw_input() if fromUser: print "Client: " + fromUser sock.sendto(fromUser, ("127.0.0.1", port)) fromServer, address = sock.recvfrom(MAX_BYTES) if __name__ == '__main__': choices = {'client': client, 'server': server} parser = argparse.ArgumentParser(description='Send and receive UDP locally') parser.add_argument('role', choices=choices, help='which role to play') parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)') args = parser.parse_args() function = choices[args.role] function(args.p)
英語

I am trying to write a Python version of the example here, but for some reason for every call to socket.recvfrom() that I make in both client and server, the address return value is None. The only thing I can think of is that maybe it has something to do with the fact that the sockets are STREAM sockets, however when I tried to change the type to socket.SOCK_DGRAM, I get errors on my call to socket.listen(). How can I fix this problem?

def server(port):     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     sock.bind(('127.0.0.1', port))     sock.listen(5)     clientsocket, address = sock.accept()      kkp = KnockKnockProtocol(); #Class which implements knock knock     outputLine = kkp.processInput();     clientsocket.sendto(outputLine, address)      inputLine, address = clientsocket.recvfrom(MAX_BYTES)      while inputLine:         print inputLine, address         outputLine = kkp.processInput(inputLine);         clientsocket.sendto(outputLine, address)         if outputLine == "Bye.":             break         inputLine, address = clientsocket.recvfrom(MAX_BYTES)   def client(port):     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     sock.connect(("127.0.0.1", port))     fromServer, address = sock.recvfrom(MAX_BYTES)      while fromServer:         print "Server: " + fromServer         if fromServer == "Bye.":             break          fromUser = raw_input()         if fromUser:             print "Client: " + fromUser             sock.sendto(fromUser, ("127.0.0.1", port))         fromServer, address = sock.recvfrom(MAX_BYTES)   if __name__ == '__main__':     choices = {'client': client, 'server': server}      parser = argparse.ArgumentParser(description='Send and receive UDP locally')     parser.add_argument('role', choices=choices, help='which role to play')     parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)')     args = parser.parse_args()     function = choices[args.role]     function(args.p) 
</div
     

回答リスト

3
 
vote
vote
ベストアンサー
 

データグラムソケットまたはストリームソケットを使用します。あなたは違いを分割しようとしています。どちらを使いたいですか?接続ベースのバイトストリームプロトコルを使用する場合は、Stream Socketsを使用してください。 ConnectionLess、データグラムプロトコルが必要な場合は、データグラムソケットを使用します。

Stream Socketsを使用する場合は、 recvfrom を使用しないでください。それは接続ベースで、あなたが受け取ることができる唯一のものはその特定の接続からのバイトです。

データグラムソケットを使用したい場合は、 listen または accept を使用しないでください。コネクションのないので、接続を聞くことも受け入れることもできません。

 

Either use datagram sockets or stream sockets. You are trying to split the difference. Which do you want to use? If you want a connection-based, byte-stream protocol, use stream sockets. If you want a connectionless, datagram protocol, use datagram sockets.

If you want to use stream sockets, don't use recvfrom. It's connection based and the only thing you can receive is bytes from that particular connection.

If you want to use datagram sockets, don't use listen or accept. Since it's connectionless, you can neither listen for nor accept a connection.

</div
 
 
   
   

関連する質問

10  DelphiでAsyncソケットプログラミングを行う慣用の方法は何ですか?  ( Whats the idiomatic way to do async socket programming in delphi ) 
Delphiでネットワークコードを書く通常の方法は何ですかWindowsスタイルの重複非同期ソケット入出力? これはこの質問についての私の事前の研究です: Indy コンポーネントは完全に同期しています。一方、SCKTCompユニットはWSAASYNCS...

0  私のTCPクライアントがIPアドレスを持つサーバーに接続しているが、「localhost」で動作するときは、例外を取得しています。  ( I am getting an exception when my tcp client connects to the server with ip addr ) 
私は単純なC#TCPクライアントとサーバープログラムを書いています。サーバーは最終的には別のマシンにありますが、今は同じマシンでテストしています。 IPアドレスを使用してTCPClientを作成すると、例外エラーが発生しています。「各ソケットアドレスの使用方法...

7  ネットワークケーブルを抜いているときにソケットに何が起こりますか?  ( What happens to sockets when i unplug a network cable ) 
ソケットを使って互いに話す3つのアプリケーションを持っています。彼らはすべて自分のマシンに住んでいますが、それらは機械を共有することもできます。今私はそれらのうちの2つとそれ自身の機械の3番目のものを持っています。私は私のコミュニケーションの弾丸を証明しようと...

2  PythonソケットプログラミングとISO OSIモデル  ( Python socket programming and iso osi model ) 
私はPCから他のPCへのパケットを送信しています。 Python Socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM ) を使用しています。パケットを受信する順序を大事にする必要がありますか? トラ...

6  ソケットはどのようにJVMで実装されていますか?  ( How are sockets implemented in jvm ) 
私は知っており、ソケットがJava仮想マシンにどのように実装されているか。 ネイティブライブラリが含まれていますか? とif、Cライブラリ? このトピックに関する情報はどこで見つかりますか? オフィスJavaチュートリアルはそこでは私を助けません。 いく...

3  AS3 FTPプログラミングとソケットとByteArrayクラス  ( As3 ftp programming and the socket and bytearray classes ) 
紹介されている件名は、Nerdier Harry Potterのタイトルのように聞こえています。 AS3のSocketクラスを使用して、Flex Builder 3で航空アプリとしてエクスポートするための単純なFTPプログラムを書くことを試みています。サーバ...

164  z / ONのC ++でC Socket APIを使用する方法  ( How to use the c socket api in c on z os ) 
z / OS上のC ++でC ++で正しく機能するようになる問題が発生しました。 sys/socket.h を含めていますが、 AF_INET が定義されていないことを伝えます。 私は明白なものを欠いているか、z / OSにいることに関連していることです...

27  同じオープンソケットを介した非同期マルチディレクタサーバクライアント通信?  ( Asynchronous multi direction server client communication over the same open sock ) 
私はクライアントがWindows Mobile 6デバイス上にあるクライアントサーバーアプリがあり、C ++で書かれており、サーバーはフルウィンドウに入ってC#で書かれています。 もともと、クライアントからサーバーにメッセージを送信するだけで、サーバーはメッ...

25  基本的なJavaサーバーを作成する方法[閉まっている]  ( How to create a basic java server ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

6  タイムアウト期間を迂回するには、すぐにソケットを閉じるにはどうすればよいですか。  ( How can i make a socket close immediately bypassing the timeout period ) 
Javaでは、ソケットを閉じると、もう何もしませんが、実際にはタイムアウト期間の後にTCP接続を閉じます。 私は何千ものソケットを使う必要があります、そして私は彼らを閉じた直後に彼らが閉じたいのですが、私の時間と私のリソースを浪費するタイムアウト期間の後では...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有