Gothostbyname在第1021个请求

时间:2015-11-04 18:31:32

标签: c

您好我在循环中发送请求然后处理它们,我必须这样做,直到用户没有停止该程序。我必须使用UDP并在1020个请求后在localhost上测试后我在gethostbyname中出错,它返回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");
} 

我没有发现这种行为,如果我没有使用localhost,那么我在120次请求后就会收到错误。

1 个答案:

答案 0 :(得分:1)

最有可能的解释是,系统上的每个进程一次只允许有1024个打开的文件描述符。其中3个是为stdinstdoutstderr保留的。

所以问题是,每次调用gethostbyname时,都会创建一个新的sockfd,但代码在完成后不会close