2015-11-04 36 views
0

你好我正在發送週期請求然後處理它們,我必須這樣做,直到程序沒有被用戶停止。我必須使用UDP和後1020只測試要求在本地主機上後,我的gethostbyname得到錯誤,它會返回NULLGethostbyname在第1021次請求後返回NULL

int sockfd, portno, n, serverlen; 
struct sockaddr_in serveraddr; 
struct hostent *server; 
portno = my_port; 
sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
server = gethostbyname(my_host); 
bzero(buf, BUFSIZE); 

if (sockfd < 0) { 
    error("ERROR opening socket"); 
} 
if (server == NULL) { 
    fprintf(stderr,"ERROR, no such host as %s\n", my_host); 
    exit(0); 
} 

bzero((char *) &serveraddr, sizeof(serveraddr)); 
serveraddr.sin_family = AF_INET; 
bcopy((char *)server->h_addr, 
(char *)&serveraddr.sin_addr.s_addr, server->h_length); 
serveraddr.sin_port = htons(portno); 
serverlen = sizeof(serveraddr); 
n = sendto(sockfd, packet, myArraySize, 0, (struct sockaddr *)&serveraddr, serverlen); 

if (n < 0) { 
    error("ERROR in sendto"); 
} 

n = recvfrom(sockfd, buf, BUFSIZE, 0, (struct sockaddr *)&serveraddr, &serverlen); 
if (n < 0) { 
    error("ERROR in recvfrom"); 
} 

我什麼也沒有發現有關此問題的,如果我不使用本地主機,然後我得到的錯誤只有120個請求後。

回答

1

最可能的解釋是,系統上的每個進程一次只允許有1024個打開的文件描述符。其中3個保留爲stdin,stdoutstderr

所以問題在於,每次您撥打gethostbyname時,您都會創建一個新的sockfd,但代碼不會在使用它時完成套接字close

+0

天啊,我想我是盲人。是的,這是足夠的關閉sockfd – Kris1112

+0

很高興我可以幫助,與代碼的好運:) – user3386109