3
학교 과제의 일환으로 python
에 매우 간단한 tcp 버전을 구현해야합니다. 자체 통신은 udp
소켓을 통해 이루어집니다.tcp의 accept() 함수 구현
제 문제는 주로 복수 클라이언트를 지원하는 accept()
의 구현입니다. 나는 그것에 대해 많은 것을 읽었지만 내 질문에 답할 수있는 어떤 출처도 찾을 수 없었다. 여기 내 코드는 바로 지금입니다 :
# Accepts an incoming connection. This method blocks until an incoming SYN message
# arrives, handles the SYN message and returns the socket.
def accept(self):
if self.state < STCP_STATE_LISTEN:
raise StcpSocketException("Socket not listening")
# Extract syn segment
while True:
syn = stcp_packet.read_from_socket(self.sock)
if syn.syn:
log.debug("(%s,%s) received SYN %s" % (self.local_addr, self.local_port, syn))
break
# TODO allocates the TCP buffers and variables
# Allocate new socket
connection = stcp_socket()
connection.bind(self.local_addr, 0)
connection.remote_addr = syn.srcIp
connection.remote_port = syn.srcPort
connection.change_state(STCP_STATE_SYN_RCVD)
# Send syn ack segment
syn_ack = connection.create_empty_pkt(True, True, False, None, syn.seqNum + 1)
self.seqNum += 1
connection.sock.sendto(syn_ack.pack(), syn.srcIp, syn.srcPort)
log.debug("(%s,%s) sent SYN ACK %s" % (connection.local_addr, connection.local_port, syn_ack))
# Extract last segment in handshake process
while True:
ack = stcp_packet.read_from_socket(connection.sock)
if ack.ack:
log.debug("(%s,%s) received ACK %s" % (connection.local_addr, connection.local_port, ack))
connection.change_state(STCP_STATE_ESTAB)
break
return connection
그리고 내 질문 :
이- 가 SYN 패킷에 새 소켓 응답이, 또는 이전 (수신기) 소켓은 3 방향 핸드 셰이크를 완료해야 하는가를?
- 클라이언트가 청취 소켓에 패킷을 계속 보내면 새롭게 생성 된 소켓으로 패킷을 전달하거나 클라이언트가 syn_ack 패킷에서 새 소켓의 IP 및 포트를 가져와 패킷을 직접 보내야합니까?
[accept (2)] (http://man7.org/linux/man-pages/man2/accept.2.html) 매뉴얼 페이지를 읽으십시오. –