inet_ntoa의 작은 문제

2673 단어 net
간단한 차단 tcp 서버는 다음과 같습니다.
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
                                                                                                                 

int main(int argc, char**argv)
{
    int listenfd,connfd,n, ret;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t clilen;
    pid_t     childpid;
    char mesg[1000], *peeraddr;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd < 0) {
        printf("create socket error
"); return -1; } printf("create socket success
"); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6789); ret = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret == -1) { printf("bind error
"); return -1; } printf("bind success
"); ret = listen(listenfd, 1024); if (ret == -1) { printf("listen error
"); return -1; } printf("listening...
"); for (;;) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); printf("Accept request from %s
", inet_ntoa(cliaddr.sin_addr)); n = read(connfd, mesg, 1000); if (n < 0) { printf("read error!
"); } printf("Received:%s
", mesg); close(connfd); } }

번역 기간에 문제가 발생하지 않았다.실행할 때 프로그램이 47줄에서segmentfault 오류를 받았습니다.man 매뉴얼로 inet_ 보기ntoa, 호출 방식은 다음과 같습니다.
char *inet_ntoa(struct in_addr in);

cliaddr의 유형 정의는 다음과 같습니다.
 struct sockaddr_in {/* in netinet/in.h */
       sa_family_t       sin_family;
       in_port_t         sin_port;
       struct in_addr    sin_addr;   
       unsigned char     sin_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - sizeof(in_port_t), sizeof(struct in_addr)];
};

언뜻 보니 별 문제가 없는데, 어떻게 한 토막의 착오가 생겼을까?
 
한참 동안 소란을 피워서야 inet_가 부족하다는 것을 알게 되었다ntoa가 있는 헤더 파일arpa/inet.h, 이 헤더 파일을 포함하면 됩니다.좋은 구덩이.
BTW, 이후 inet_ 사용 최소화ntoa, inet_ntop이 대신합니다.

좋은 웹페이지 즐겨찾기