2016-10-13 4 views
0

연결을 허용하는 매우 간단한 서버를 만들려고합니다.sockaddr.sin_port = 1337이 "실제"열린 포트와 일치하지 않습니다.

(UNKNOWN) [127.0.0.1] 1337 (?) : 127.0.0.1:1337에 연결하려고 할 때

int sock, serv; 
struct sockaddr_in in_sock; 
serv = socket(AF_INET, SOCK_STREAM, 0); 
in_sock.sin_addr.s_addr = 0; 
in_sock.sin_port = 1337; 
in_sock.sin_family = AF_INET; 
bind(serv, (struct sockaddr *)&in_sock, sizeof(in_sock)); 
listen(serv, 0); 
client = accept(serv, 0, 0); 

는 그러나, 나는 연결이 메시지를 거부 얻을 연결

거부

TCP 0 0 0.0.0.0 :

그러나 간단한 netstat -tcpan는 포트가 참으로 열립니다 저를 보여줍니다 14597 0.0.0.0:* LISTEN

sin_port를 훨씬 높은 포트로 설정하면 제대로 작동하는 것 같습니다.

무엇이 여기에 있습니까? 1337 항구가 열리지 않는 이유는 무엇입니까? 그것도 무료 것 같습니다.

+0

당신이 포트가 바이트 순서를 전환하는 ['htons'] (https://linux.die.net/man/3/htons)를 사용하는이 좋아 –

답변

3

struct sockaddr_in의 포트 번호 필드는 네트워크 바이트 순서로 저장됩니다. 이것은에 값을 저장 할 때 htons()를 사용해야한다는 것을 의미한다 :

in_sock.sin_port = htons(1337); 

그렇지 않으면, 포트 번호가 남아있을 것입니다 바이트 스왑. 어떤 정확히 무슨 일이 일어난된다

1337 = 0x0539 
14597 = 0x3905 
+0

재밌 네요. 문제가 될 수도 있다고 생각했는데, 더 깊이 들어가야했습니다. 고마워, 그게 문제 였어. – user96649

1
listen(serv, 0); 

listen에 두 번째 인수는 backlog이며, 우리가 documentation for listen 보면 :

백 로그 인수는 sockfd와 대한 중인 연결 큐가 증가 할 수있는 최대 길이를 정의합니다. 대기열이 가득 찼을 때 연결 요청 이 도착하면 클라이언트는 에 ECONNREFUSED의 오류를 수신하거나 기본 프로토콜이 재전송을 지원하는 경우 해당 요청이 무시되어 나중에 연결을 시도 할 때 이 다시 성공할 수 있습니다.

ECONNREFUSED은 백 로그가 꽉 차서 (항상 0으로 유지되어 항상 가득 차 있기 때문에) 얻는 오류 메시지입니다. 숫자를 1 이상으로 늘려야하지만 더 많은 금액이 더 좋을 수도 있습니다. listen(serv, 10);.

+0

, 그렇다면 netstat에 표시된 포트에 왜 연결할 수 있습니까? 따라서 올바른 주소에서 포트가 열리고 ECONNREFUSED가 전송되지만 잘못된 포트에서 다른 포트가 열리지 만 연결할 수 있습니까? – user96649

관련 문제