2009-07-17 4 views
2

나는 무엇을 할지를 알기 위해 소량의 데이터를 기다리는 포트를 수신하는 프로그램을 가지고 있습니다. 해당 프로그램의 인스턴스 5 개를 실행합니다 (각 포트에서 5000에서 5004까지 포함).소켓을 몇 번 열어 쓰고 닫으려고 할 때 연결이 거부되었습니다 (파이썬)

파이썬으로 작성된 두 번째 프로그램은 소켓 "s"를 만들고 포트 5000에 데이터를 쓰고 닫습니다. 그런 다음 포트 번호를 증가시키고 5001에 연결된 새 소켓을 만듭니다. 5004에 도달 할 때까지이 작업을 수행합니다.

첫 번째 소켓 연결은 정상적으로 작동합니다. 포트 5000에서 5002에있는 프로그램은 데이터를 정상적으로 수신합니다. 그러나 네 번째 소켓 연결 결과 "연결 거부 됨"오류 메시지가 나타납니다. 한편, 네 번째 청취 프로그램은 여전히 ​​포트 5003에서 대기 중임을보고합니다. 텔넷을 사용하여 연결할 수 있으므로 제대로 듣고 있습니다.

포트 번호를 변경하려고 시도했지만 실패 할 때마다 네 번째 연결이 시도됩니다.

확인해야하는 시스템에 제한이 있습니까? 송신 측에서는 언제든지 하나의 소켓 만 열어 둘 수 있으며 실제로 5를 통해 3을 얻을 수 있다는 사실은 내가 생각할 수있는 많은 기본 문제 해결 단계를 제거합니다.

의견이 있으십니까? 감사!

--- 편집 ---

내가 파이썬 버전 2.6에 CentOS 리눅스입니다. 여기에 몇 가지 예제 코드입니다 :. 이것은에서 발로 방화벽의 항 포트 스캔 측정처럼 많이 소리

try: 
     portno = 5000 
     for index, data in enumerate(data_list): 
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
       s.connect(('myhostname', portno)) 
       s.sendall(data) 
       s.close() 
       portno = portno + 1 
except socket.error, (value,message): 
     print 'Error: Send could not be performed.\nPort: ' + str(portno) + '\nMessage: ' + message 
     sys.exit(2) 
+3

유용하게도 문제를 해결할 수있는 정보가 충분하지 않습니다. 기본 소켓 작업을 수행하는 작은 스크립트로 범위를 좁히십시오. 여전히 이해할 수없는 경우 간단한 스크립트 만 포함하십시오. –

+0

어떤 Python 버전을 실행하고 있습니까? 그리고 어떤 플랫폼 (OS)에서? –

+0

프로그램에 버그가있는 것 같지만 코드를 보여줄 수없는 한별로 도움을 줄 수 없습니다. netstat 프로그램을 사용하여 조금 디버깅 할 수 있습니다.이 경우 컴퓨터의 모든 프로세스의 연결 상태가 표시됩니다. – nos

답변

1

1

내가 그 소켓에 대해 많은, 그래서이있을 수 있습니다 정말 나쁜 스타일을 모른다. .. 자신의 위험에 사용. 이 코드는 :

#!/usr/bin/python 
import threading, time 
from socket import * 
portrange = range(10000,10005) 

class Sock(threading.Thread): 
    def __init__(self, port): 
     self.port = port 
     threading.Thread.__init__ (self) 

    def start(self): 
     self.s = socket(AF_INET, SOCK_STREAM) 
     self.s.bind(("localhost", self.port)) 
     self.s.listen(1) 
     print "listening on port %i"%self.port 
     threading.Thread.start(self) 
    def run(self): 
     # wait for client to connect 
     connection, address = self.s.accept() 
     data = True 
     while data: 
      data = connection.recv(1024) 
      if data: 
       connection.send('echo %s'%(data)) 
     connection.close() 

socketHandles = [Sock(port) for port in portrange] 

for sock in socketHandles: 
    sock.start() 

# time.sleep(0.5) 

for port in portrange: 
    print 'sending "ping" to port %i'%port 
    s = socket(AF_INET, SOCK_STREAM) 
    s.connect(("localhost", port)) 
    s.send('ping') 
    data = s.recv(1024) 
    print 'reply was: %s'%data 
    s.close() 

출력한다 :

listening on port 10000 
listening on port 10001 
listening on port 10002 
listening on port 10003 
listening on port 10004 
sending "ping" to port 10000 
reply was: echo ping 
sending "ping" to port 10001 
reply was: echo ping 
sending "ping" to port 10002 
reply was: echo ping 
sending "ping" to port 10003 
reply was: echo ping 
sending "ping" to port 10004 
reply was: echo ping 

아마도이이 문제를 일으키는 방화벽 만약 당신이 볼 도움이 될 것입니다. 이것을 클라이언트와 서버로 분할 해 볼 수도 있다고 생각합니다.

+1

파이썬 라이브러리 docs에있는 소켓 예제에서는 수신하지 않고 보내지 않습니다. 소켓은 까다로운 일이 될 수 있으므로 socket.recv()가 호출되고 세 번째 포트가 지나면 버퍼가 가득 차서 어떤 종류의 대기 상태에 갇히게 될 때까지 모든 ack가 버퍼링됩니다. –

0

Idle 내에서 두 번째 Python 프로그램을 실행하고 있습니까? 그렇다면 유휴 상태에서 시도해보고 결과가 다른지 확인하십시오.