나는 서버 - 클라이언트 프로그램을 작성하고 서버에서 getaddrinfo 및 getsockname을 사용하여 로컬 IP 주소 및 로컬로 연결된 포트 번호에 대한 정보를 얻습니다. 이 정보를 사용하여 클라이언트 프로그램을 시작하고 getaddrinfo를 사용한 다음 servinfo 데이터 구조에 반환 된 값을 출력합니다. getaddrinfo (argc [1], argc [2], & 힌트, & servinfo); >> 서버 호스트 이름과 서버 포트 번호는 명령 행을 통해 전달됩니다.죄송합니다 getaddrinfo에 반환 된
하지만 servinfo의 sin_port가 명령 줄을 통해 전달하는 포트가 아니라는 것을 알았습니다. 1)이 getaddrinfo는 클라이언트가 소스 포트 번호로 사용하는 포트 번호를 반환합니까? 2) getaddrinfo 및 소켓 호출이 실패한 후 연결 호출이 실패합니다. 나는 이유를 모른다. 어떻게 디버깅합니까?
내 클라이언트 코드 :
memset(&hints, 0 ,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME | AI_NUMERICSERV;
getaddrinfo(argc[1], argc[2], &hints, &servinfo);
for (p = servinfo till p!=NULL)
sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)
connect(sockfd, p->ai_addr, p->ai_addrlen) >>>>> Connect not going through.
나는이처럼 내 클라이언트 프로그램을 시작 를 myservername ./a.out 18,844
감사합니다!
getaddrinfo()가 오류와 함께 실패하지 않았다는 것을 어떻게 알 수 있습니까? 반환 값이 0인지 아닌지 확인하지 않습니다. gettaddrinfo()가 실패하면 당연히 출력 인수에 데이터가 기록되지 않습니다. –
나는 그것을 servername과 함께 호출하고있다. 그러나 그것을 놓친 것은 문제 설명에 그것을 추가합니다. – Vin
getaddrinfo의 리턴 코드를 확인해야합니다. 그것은 servinfo 구조에서 반환되는 IPv4 주소를 읽을 수 있기 때문에 실패하지 않아야합니다. – Vin