2016-07-18 3 views
0

IP 주소와 포트가 모두 사용되지 않음 netstat -a -n. gdb를 사용하고 bind를 호출 할 때 정확한 IP 주소와 포트가 적절한 소켓 주소 길이 16과 함께 사용되는 것을 볼 수 있습니다. UDP Listener. 원격 IP는 정적이며 구성 파일에서 읽습니다. '요청 된 주소를 할당 할 수 없습니까?'

는이 GDB에서입니다

void CSocket::Bind(IpEndPoint& endPoint) 
{ 
    int bindResult = bind(socketHandle, endPoint.GetSockAddrPtr(), 
     endPoint.GetAddrLength()); 
    if(bindResult < 0) 
    { 
     TRACE_ERROR("Failed to bind to socket. %s. IpAddress %s Port %d AddrLength %d", 
      strerror(errno), endPoint.GetIpAddressString(), 
      ntohs(endPoint.GetPort()), endPoint.GetAddrLength()); 

,

Breakpoint 1, CSocket::Bind (this=0x819fa24, ipAddress="192.0.2.77", port=4185) at Socket.cpp:126

코드이며,이 내가 다시 봤는데

ERROR: Failed to bind to socket. errno 99 (Cannot assign requested address). IpAddress 192.0.2.77 Port 4185 AddrLength 16

위의 코드에서 TRACE_ERROR입니다 Beej's Guide to Network Programming을 읽었지만 실마리를 찾지 못했습니다. 이것은 UDP이므로 연결을 바인딩 할 필요가 없습니다. 방화벽이 꺼져 있습니다. 내가 어디에서보고 있니?

+0

IP 주소가 문자열로 변환되는 방식을 봅니다. 필요한'struct sockaddr' 객체에 추가합니다. 로컬 주소에 실제로 바인딩 할 주소가 있습니까? 원격 호스트 일 경우 대신 connect를 사용하십시오. 포트가 이미 사용 중입니까? (...) – Aconcagua

+0

그냥 팁 : 개인적으로 오류 문자열보다는 오류 코드를 선호합니다. 아마도 나는 유일한 것이 아닙니다. e를 사용하는 것이 좋습니다. 지. '% d (% s) ', errno, strerror (errno)'두 부분을 모두 만족시킵니다. – Aconcagua

+0

@Aconcagua 감사합니다. 제안한대로 오류 코드가 추가되었습니다. UDP가 연결이 필요없는 경우'connect'가 필요한 이유는 무엇입니까? – jacknad

답변

1

@Aconcagua가 말한 바에 따르면 : 로컬 주소 ("사용하지 않는 주소"가 아닌 주소)를 바인딩하려고합니다. 로컬 주소만으로는 충분하지 않습니다. 어떤 주소에 바인드하려면 INADDR_ANY을 사용하거나 로컬 인터페이스 중 하나에 할당 된 주소를 바인드해야합니다. 이것은 아마도 문제입니다. (bind은 로컬 주소를 설정하고 connect은 원격 주소를 설정합니다. 또는 UDP를 사용하면 패킷 당 원격 주소를 sendto으로 지정할 수 있습니다.) - Gil Hamilton

관련 문제