-1

クライアントが特定のポートに入るすべてのタイプのデータをリッスンしているPythonで単純なクライアントサーバーアプリを作成しています。データフローを受信するときに、接続されたクライアント(動的IPを持つ)に送り返したい文字列、この場合は "001"。しかし、メッセージを送信しようとすると、失敗します!

#!/usr/bin/env python

import socket

TCP_IP = '192.168.1.115'        
TCP_PORT = 55001   
BUFFER_SIZE = 1024      
MESSAGE = '01'  

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
s.bind((TCP_IP, TCP_PORT))     
s.listen(1)     

conn, addr = s.accept()         
print ('Connection address:', addr)      
while 1:       
    data = conn.recv(BUFFER_SIZE)     
    if not data: break      
    print ('received data:', data)      
    conn.send(data)  # echo       

print ('Sending data to client...')   

addr change every connection .. i cannot manage this! 

s.connect((addr, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()   
4

2 に答える 2

1

(接続されたストリーム) ソケットは双方向であるためconnect、クライアントへの接続を取得するために呼び出す必要はありません。既に接続されています。

しかし、コードが失敗する理由を知りたいです。そして、それには少なくとも3つの問題があります。

まず、listenまたはconnectを呼び出した後は、再度socket呼び出すことはできません。connect例外が発生します(EISCONNPOSIXでは、Windowsでは同等のもの)。新しい を作成する必要がありますsocket

2 番目に、クライアントは実際にサーバーと同じポートで接続に対してbinded およびing を行っていますか? listenそうでなければ、あなたconnectは働くことができません。そのbind場合、クライアントとサーバーが同じマシン上にあると失敗します。

第三に、addrあなたが戻ってくるacceptのは(host, port)ペアであり、単なるホストではありません. したがって、書かれているように、しようとしていますがconnect((('192.168.1.115', 12345), 55001))、これは明らかにうまくいきません。

于 2013-02-06T09:14:05.433 に答える
0

サーバー リスニング ソケット ( ) を使用してクライアントに応答しようとしていますs。これは、UDP サーバーでのみ可能です。これは TCP サーバーであるため、リモート クライアントとの通信にconn使用して作成された を使用する必要があります。s.accept()

于 2013-02-06T09:18:45.630 に答える