我正在关注此链接Socket programming中的套接字编程教程。并尝试开发一个应用程序,客户端将从服务器接收网络时间并打印时间。以下是该计划的运作方式 -
服务器正在等待传入连接,当客户端尝试连接服务器时,服务器接受连接,服务器将时间发送给客户端。通过socket客户端接收后打印时间。
每次发送给客户端的消息后,服务器关闭连接并等待下一次。 客户端能够与服务器 进行1020次通信。 如果我尝试从客户端到服务器通信超过1020次,那么我 错误 - 无法创建套接字
我正在尝试开发一个应用程序,客户端可以与服务器无限次或至少20000次进行通信。
我怀疑,在客户端创建套接字时可能没有释放内存。
Sample output :
counter=1017 Sun Jul 6 03:19:48 2014
counter=1018 Sun Jul 6 03:19:48 2014
counter=1019 Sun Jul 6 03:19:48 2014
counter=1020 Sun Jul 6 03:19:48 2014
错误:无法创建套接字 (为什么?)
这是我的代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[1025];
time_t ticks;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
ticks = time(NULL);
snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
write(connfd, sendBuff, strlen(sendBuff));
close(connfd);
// sleep(1);
}
}
Client.c
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int sockfd = 0, n = 0;
char recvBuff[1024];
struct sockaddr_in serv_addr;
if(argc != 2)
{
printf("\n Usage: %s <ip of server> \n",argv[0]);
return 1;
}
int counter=0;
while(counter <2000)
{
memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000);
if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
recvBuff[n] = 0;
printf("counter=%d ",counter);
fputs(recvBuff, stdout);
/*
if(fputs(recvBuff, stdout) == EOF)
{
printf("\n Error : Fputs error\n");
}
*/
}
counter++;
}
if(n < 0)
{
printf("\n Read error \n");
}
return 0;
}
我在Ubuntu下使用gcc。任何有助于理解原因和解决方案以及运行该程序大约20000的帮助都将受到高度赞赏。提前谢谢。
答案 0 :(得分:4)
使用它后,您没有关闭客户端的套接字。您需要在客户端代码中使用此行:
close(sockfd);
在你的while循环之后。
答案 1 :(得分:2)
您似乎在客户端代码中泄漏了套接字。您在外部循环中创建套接字,但是您永远不会关闭它们。尝试将close(sockfd);
添加到外部循环的末尾,并添加到您中断或退出的所有点。
答案 2 :(得分:0)
由于您使用相同的客户端连接到服务器,因此无需重新启动socket&amp;连接进程,您可以阻止客户端,直到您从服务器获取一些数据。否则,您不必浪费大量内核资源,而且您正在关闭并在非常快速的阶段开放,这不是一个好主意!
答案 3 :(得分:0)
我有同样的问题。
在我的情况下,在fopen("/proc/net/route" , "r");
之后,我忘了fclose()
。
在fopen("/proc/net/route" , "r");
之后,我发现套接字号增加了,所以我认为这是同样的问题。