0
我在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;
}
}
第一次它工作得很好,我可以連接並可以通過套接字發送數據。當客戶端關閉連接時,檢測到錯誤,我關閉套接字再次啓動服務器以等待新連接。但是,當我第二次接受(..)時出現分段錯誤! 有人可以幫助我!非常感謝!
忘記它。你的代碼是內外顛倒的。如果客戶消失,重新與您聯繫是他的問題,而不是相反。你應該有一個接受循環運行在其他地方,最終到達你的發送方法。不是相反的。 – EJP 2014-11-25 08:35:17
在系統調用失敗時使用'perror';也使用'strace' – 2014-11-25 08:48:02