我在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;
}
}
第一次工作正常,我可以连接并可以通过套接字发送数据。当客户端关闭连接时检测到错误,我关闭套接字再次启动服务器以等待新连接。但是,当我第二次接受(..)时,我得到了分段错误! 有谁可以帮助我吗!!!非常感谢!
答案 0 :(得分:1)
当客户端连接关闭时,您正在做什么并不清楚。我看到你的代码中没有循环,但你建议不止一次调用accept()
。
在没有看到其余部分或代码的情况下,我只能推测:
initServer()
,因此尝试反复重新创建相同的服务器套接字(当然,这会很糟糕),或
accept()
,很可能是腐败的参数。至少,服务器端代码应该做的是初始化服务器套接字一次,然后循环accept()
,如下所示:
socket()
一次bind()
一次listen()
一次accept()
,此调用将阻塞,直到客户端连接,然后返回连接的套接字,