유닉스 네트워크 프로그래밍 75회

종료 제어

for(;;)
{
    len=sizeof(struct sockaddr_in);
    rd_sz=Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf), (SA *)&cliaddr, &len, &sri, &msg_flags);
    if(stream_increment){
        sri.sinfo_stream++;
        if(sri.sinfo_stream>=sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len))
        sri.sinfo_stream=0;
    }
    Sctp_sendmsg(sock_fd, readbuf, rd_sz,(SA *)&cliaddr, len, sri.sinfo_ppid, (sri.sinfo_flags|MSG_EOF), sri.sinfo_stream,0,0);
}

서버는 회신 시 연결을 종료합니다.

if(echo_to_all==0)
    sctpstr_client(stdin,sock_fd, (SA *)&servaddr, sizoef(seraddr));
else
    sctpstr_client_echoall(stdin,sock_fd, (SA *)&servaddr, sizeof(servaddr));
strcpy(byemsg,"goodbye");
Sctp_sendmsg(sock_fd, byemsg, strlen(byemsg), (SA *)&servaddr, sizeof(servaddr),0,MSG_ABORT,0,0,0);
Close(sock_fd);

클라이언트가 닫히기 전에 연결을 중단합니다.

이름 및 주소 변환

소개

지금까지 이 텍스트의 모든 예에서는 호스트에 숫자 주소(예: 206.6.226.33)와 숫자 포트 번호를 사용하여 서버를 식별했습니다(예: 표준 주간 서버의 경우 포트 13, 에코 서버의 경우 포트 9877). 그러나 여러 가지 이유로 숫자 대신 이름을 사용해야 합니다. 이름은 기억하기 쉽습니다. 숫자 주소는 변경될 수 있지만 이름은 동일하게 유지될 수 있습니다. 그리고 IPv6로 이동함에 따라 숫자 주소가 훨씬 더 길어져 수동으로 주소를 입력하는 것이 훨씬 더 오류가 발생하기 쉽습니다.

DNS(도메인 이름 시스템)

DNS는 주로 호스트 이름과 IP 주소를 매핑하는 데 사용됩니다. 호스트 이름은 solaris 또는 freebsd와 같은 단순한 이름이거나 solaris.unpbook.com과 같은 정규화된 도메인 이름 '(FQDN)일 수 있습니다.

기술적으로 FQDN은 절대 이름이라고도 하며 마침표로 끝나야 하지만 사용자는 종종 마침표를 생략합니다. 후행 마침표는 확인자에게 이 이름이 정규화되었으며 가능한 도메인 목록을 검색할 필요가 없음을 알려줍니다.
이 섹션에서는 네트워크 프로그래밍에 필요한 DNS의 기본 사항만 다룰 것입니다.

'gethostbyname' 함수

호스트 컴퓨터는 일반적으로 사람이 읽을 수 있는 이름으로 알려져 있습니다. 지금까지 이 책에서 보여준 모든 예는 의도적으로 이름 대신 IP 주소를 사용했기 때문에 connect 및 sendto와 같은 함수의 소켓 주소 구조에 무엇이 들어가고 accept 및 sendto와 같은 함수에서 반환되는 것이 무엇인지 정확히 알고 있습니다. recvfrom. 그러나 대부분의 애플리케이션은 주소가 아닌 이름을 처리해야 합니다. IPv6 주소(16진수 문자열)가 IPv4 점으로 구분된 10진수보다 훨씬 더 길기 때문에 IPv6으로 이동함에 따라 특히 그렇습니다. (이전 섹션의 예제 AAAA 레코드 및 ip6.arpa PTR 레코드는 이를 명확하게 보여줍니다.)

호스트 이름을 조회하는 가장 기본적인 기능은 gethostbyname입니다. 성공하면 호스트에 대한 모든 IPv4 주소를 포함하는 hostent 구조에 대한 포인터를 반환합니다. 그러나 IPv4 주소만 반환할 수 있다는 점에서 제한적입니다.

추천

출처blog.csdn.net/myfather103/article/details/82555334