如何完全销毁C中的套接字连接[英] How to completely destroy a socket connection in C

本文是小编为大家收集整理的关于如何完全销毁C中的套接字连接的处理方法,想解了如何完全销毁C中的套接字连接的问题怎么解决?如何完全销毁C中的套接字连接问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在Linux中使用套接字进行了聊天客户端,我希望完全销毁连接.以下是代码的相关部分:

int sock, connected, bytes_recieved , true = 1, pid;  
char send_data [1024] , recv_data[1024];     
struct sockaddr_in server_addr,client_addr;    
int sin_size;
label:
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
    perror("Socket");
    exit(1);
}
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1)
{
    perror("Setsockopt");
    exit(1);
}
server_addr.sin_family = AF_INET;         
server_addr.sin_port = htons(3128);     
server_addr.sin_addr.s_addr = INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1)
{
    perror("Unable to bind");
    exit(1);
}
if (listen(sock, 5) == -1)
{
    perror("Listen");
    exit(1);
}
printf("\nTCPServer Waiting for client on port 3128");
fflush(stdout);
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
//necessary code
close(sock);
goto label;

但关闭(袜子)似乎完全关闭了销毁连接,因为在"标签"之后,代码退出显示错误消息

Unable to bind: Address already in use

这是连接不会再发生.问题是什么?预先感谢.

编辑:当我在销毁连接后从开头运行脚本时,我应该作为一个新的程序运行.我该怎么做?

推荐答案

close呼叫仅标记TCP插座关闭.它不再可用了. 但内核仍可能持有一些资源(time_wait,2mls等).

so_reuseaddr的设置应删除绑定问题.

因此,请确保在调用setsockopt时,true的值真的是非零,因为overflow bug可能覆盖它):

true = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))

有pid变量是您的代码.如果您使用fork(用于启动连接处理过程),那么您也应该在不需要它的过程中关闭sock.

其他推荐答案

首先用于命名,所以我们所有的名字都同样的事情:

服务器端:

传递给listen()然后to accept()让我们调用侦听套接字. accept()返回的套接字让我们召集接受套接字.

客户端:

传递给connect()让我们调用连接/连接的套接字.


关于您的问题:

要终止accept() ED连接关闭接受套接字(您所呼叫连接的),首先使用 shutdown() ,后跟 close () .

然后接受一个新的连接循环在呼叫到accept()之前, not 再次通过bind()和listen().

shutdown和关闭侦听套接字如果要在accept()返回后发出的挂起 connect() s.

其他推荐答案

连接仍然是活动的,因为您忘记关闭已连接的套接字.关闭侦听套接字不会自动关闭连接的插座.

//necessary code
close(connected);  // <---- add this line
close(sock);
goto label;

我不确定为什么你得到eaddrinuse.代码在Linux和Mac OS上工作正常.

本文地址:https://www.itbaoku.cn/post/359176.html