gpt4 book ai didi

c - Linux 上 accept() 的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:47 25 4
gpt4 key购买 nike

我对 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(..) 时出现了段错误!!!有人能帮助我吗!!!非常感谢!

最佳答案

当客户端连接关闭时,您不清楚您在做什么。我在您的代码中没有看到循环,但您建议多次调用 accept()

没有看到其余部分或代码,我只能推测:

  • 您重复调用 initServer(),因此尝试一遍又一遍地重新创建相同的服务器套接字(当然,这会很糟糕),

  • 您在代码中的其他地方再次调用了 accept(),很可能带有损坏的参数。

至少,您的服务器端代码应该做的是初始化服务器套接字一次,然后循环 accept(),如下所示:

  • 调用一次socket()
  • 调用一次bind()
  • 调用一次listen()
  • 然后循环:
    • 调用accept(),这个调用会阻塞直到客户端连接,然后返回一个连接的套接字,
    • 对那个(连接的客户端)套接字做任何你需要做的事情
    • 继续循环

关于c - Linux 上 accept() 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27121689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com