2013-03-16 2 views
0

저는 잠시 동안 파고 들었습니다. 저는 잘 이해하고 있습니다. 나는 무엇을하려고하는지 정확히 알지 못합니다.어떤 클라이언트가 서버로 데이터를 전송하고 있는지 어떻게 알 수 있습니까?

여러 클라이언트가 연결되는 서버가 필요합니다. 가끔씩 클라이언트는 새로운 서버 집합 (기본적으로 분산 컴퓨팅)을 쿼리하여 서버가 쿼리 한 클라이언트로 다시 전송합니다.

다시 응답 할 수 있도록 서버를 쿼리 한 클라이언트를 어떻게 알 수 있습니까?

저는 Python을 처음 접했고 select() 함수 자체가 약간 혼란 스럽습니다. 나는 새로운 연결을 받아들이고 입력을 할 수 있지만 서버는 어떤 클라이언트가 그 클라이언트와 대화하고 있는지 알지 못한다. (아마도 내 디버깅 텍스트가 정확하지 않고 알 수있다.). 기본적으로이 명령의 일종을 수신하고 돌아 서서 그것을 필요로하는 데이터를 전송

while running: 
    #select returns 3 subsets of the input containing sockets that have stuff to be read, empty buffer for writing, or an error 
    readers, writers, error = select.select(input, output, errors) 
    for s in readers: 
     if s == serversocket: 
      #readable server socket is ready for connection 
      connection, client_addr = s.accept() 
      print >> sys.stderr, 'new connection from', client_addr 
      connection.setblocking(0) 
      #clients.append([client_addr, performance]) 
      input.append(connection) 
      output.append(connection) 
     else: 
      #readable socket, not ready for new connection 
      data = s.recv(1024) 
      print >> sys.stderr, "readable socket, not ready for new connection" 
      if data: 
       #the socket actually has data (put Compute process data into list) 
       print >> sys.stderr, "Data received" 
       substring = data[0:data.find("sss")]; 
       print >> sys.stderr, 'received %s from %s' % (substring, client_addr) 
       if substring == "-get": 
        print >> sys.stderr, 'received -get command' 
        determinerange() 
        print >> sys.stderr, 'sending range of %d to %d', currentlow, currenthigh 
        temp = currentlow+"\0" 
        connection.send(currentlow) 
        temp = currenthigh+"\0" 
        connection.send(currenthigh) 
       elif substring == "-k": 
        print >> sys.stderr, 'received -k, stopping' 

:

어쨌든, 여기에 서버의 코드입니다. 당신이 궁금해하는 경우에,이 서버는 내가 실제로 쓰고있는 C 프로그램과 대화해야하는데, 실제로 계산을합니다. 그래서 "\ 0"개행 문자를 추가하고 있습니다. 클라이언트 중 하나에서 -k를 수신하면 모든 클라이언트를 중지하고 종료해야합니다.

참고 : 표준 파이썬 라이브러리 만 사용할 수 있습니다. 나는 물건을 더 쉽게 만들 수있는 여분의 것들을 얻을 수 없다 :)

미리 도움을 주셔서 감사합니다!

+0

일반적으로 이와 비슷한 항목은 더 큰 프레임 워크 안에 있습니다. 소켓 연결의 설정은 한 단계가 될 것이고 미리 정의 된 일부 프로토콜을 기반으로 인증을 처리하는 다른 실행중인 프로세스 나 모듈로 라우트됩니다. 여기서 파이썬 네트워킹 객체는 여러분의 TCP 정보를 관리합니다. 예를 들어 accept()에서 반환 된 client_addr은 보낸 사람 IP를 제공합니다. –

+0

예. 그리고 그 클라이언트에 데이터를 반환하기 전에 사용할 수 있지만 다른 클라이언트가 데이터를 그 클라이언트에게 보내기 전에 다른 연결이 발생하지 않는 경우에만 사용할 수 있습니다. 새 연결이 제공되면 client_addr을 최신 연결 클라이언트로 설정합니다. 그 사람에 대한 client_addr을 알지 못하고 데이터를 보낸 클라이언트에게 어떻게 데이터를 다시 보내는 지 궁금합니다. EJP는 단순히 동일한 소켓으로 다시 보내면 데이터를받을 때 클라이언트 정보도 포함된다는 의미일까요? 데이터를 전송하면 방금받은 데이터가 자동으로 선택됩니다. – FeralShadow

+0

소켓 개체에 대한 참조는 고유 한 원격 서버와의 연결입니다. 당신은 기본적으로 원하는 바이트를 보내거나받을 수 있습니다. 양쪽 끝이 무엇을 할 것인가에 동의한다고 가정합니다. [http : //www.tutorialspoint.com/python/python_networking.htm] (http : //www.tutorialspoint.com/python/python_networking.htm) –

답변

1

시도 대신에 저장된 클라이언트, 당신은 일부 데이터를받은 누구로부터 현재 클라이언트에 메시지를 보내드립니다

   s.send(currentlow) 
       ... 
       s.send(currenthigh) 

변수 연결.

+0

오오! 내가 참조! 아주 멋지다. 일부 이유로 나를 선택하는 것이 매우 혼란 스럽습니다. – FeralShadow

+0

좋아, 이제 신비한 파이프가 나옵니다. 나는 그것이 C 프로그램에 있어야한다고 생각합니다. – FeralShadow

+0

사실, 서버에서 데이터를 보낸 후 C 프로그램이 문제가없는 것으로 확인되었지만 스크립트는 더 많은 쿼리를 수신하는 대신 연결을 닫으려고합니다. 왜 이런거야? – FeralShadow

1

어떤 클라이언트인지 알 필요가 없습니다. 소켓은 모든 의도와 목적에 맞게 클라이언트입니다. 요청을받은 동일한 소켓을 통해 응답을 보내십시오.

   connection.send(currentlow) 
       ... 
       connection.send(currenthigh) 

에 의해 : 라인을 대체 할

+0

서버가 연결된 모든 클라이언트에게 메시지를 보내지 못하게하려면 어떻게해야할까요? – FeralShadow

+0

나는 당신이 무슨 말을하고 있는지 전혀 모른다. 그런 식으로 코드를 작성하는 것을 막을 수있는 방법은 없습니다. * 선택하면 코드를 작성하지 않는 한 서버에서 아무 것도 보내지 않습니다. 코드를 작성하면 클라이언트에게 요청을 보냅니다. 온. – EJP

+0

아 아아. 음, 분명히 Select()가 어떻게 작동하는지 오해 한 것 같습니다. 나는 그것이 연결된 클라이언트의 목록을 만드는 것이라고 생각 했었고 어떤 식으로 데이터를 보낼지 지정해야했습니다. – FeralShadow

관련 문제