在Linux上接受()的分段错误
问题描述:
我在linux上的客户机/服务器程序有问题。 我写了一个服务器程序,它将数据循环发送到一个连接的客户端。 现在我想检测,如果客户端关闭到服务器的连接。当连接从客户端关闭时,我想等待接受(...)一个新的连接。 这里我的代码的关键部分:在Linux上接受()的分段错误
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()
。
在没有看到休息或代码,我只能推测:
- 你一边喊
initServer()
,因此试图一遍又一遍(其中,当然,会重新创建相同的服务器套接字坏),
或
- 你在你的代码再次调用
accept()
别的地方,最有可能与腐败的说法秒。
最起码,你的服务器端代码应该做的是一次初始化服务器插座,然后环周围accept()
,就像这样:
- 呼叫
socket()
一次 - 呼叫
bind()
一次 - 通话
listen()
一次 - 然后通过循环:
- 电话
accept()
,这个调用将阻塞,直到客户端连接,然后返回连接的插座, - 做任何你需要的是(连接的客户端)做插座
- 恢复与环
- 电话
忘记它。你的代码是内外颠倒的。如果客户消失,重新与您联系是他的问题,而不是相反。你应该有一个接受循环运行在其他地方,最终到达你的发送方法。不是相反的。 – EJP 2014-11-25 08:35:17
在系统调用失败时使用'perror';也使用'strace' – 2014-11-25 08:48:02