【发布时间】:2015-01-23 03:50:22
【问题描述】:
我在 linux 上的客户端/服务器程序有问题。 我编写了一个服务器程序,它将循环数据发送到一个连接的客户端。 现在我想检测客户端是否关闭了与服务器的连接。当从客户端关闭连接时,我想用 accept(...) 等待新连接。 这是我的代码的关键部分:
error = send(client_sock, Zeichen, 1, MSG_NOSIGNAL);
if(error < 0)
{
connected = 0;
printf("Error, write on TCP Socket failed!!! Reconnecting... \r\n");
close(serverSocket);
initServer();
}
int initServer(void)
{
int *new_sock;
socklen_t size;
struct sockaddr_in server, client;
serverSocket = socket(AF_INET , SOCK_STREAM , 0); //Create socket
if (serverSocket == -1)
{
printf("Could not create socket \r\n");
return 0;
}else
{
printf("Socket created \r\n");
}
server.sin_addr.s_addr = inet_addr(IPAdresse);
server.sin_family = AF_INET;
server.sin_port = htons(TCPPort);
if(bind(serverSocket,(struct sockaddr *)&server , sizeof(server)) < 0)
{
printf("bind failed. Error \r\n");
return 0;
}else
{
printf("bind done \r\n");
}
listen(serverSocket, 1);
printf("Waiting for incoming connections... \r\n");
size = sizeof(sockaddr_in);
printf("size of sockaddr_in: %i \r\n", size);
client_sock = accept(serverSocket, (struct sockaddr *)&client, &size);
if (client_sock < 0)
{
printf("accept failed \r\n");
return 0;
}else
{
connected = 1;
return 1;
}
}
第一次工作正常时,我可以连接并可以通过套接字发送数据。当客户端关闭连接时检测到错误,我关闭套接字并再次启动服务器以等待新连接。但是,当我第二次执行 accept(..) 时,我得到了分段错误!!! 有人能帮助我吗!!!非常感谢!
【问题讨论】:
-
算了。您的代码从里到外颠倒。如果客户消失了,重新连接到您是他的问题,而不是相反。您应该在其他地方运行一个接受循环,最终到达您的发送方法。反之亦然。
-
在系统调用失败时使用
perror;也使用strace