c - 如何完全破坏C中的套接字连接

标签 c linux sockets network-programming

我在 linux 中使用 socket 创建了一个聊天客户端,我希望完全破坏连接。以下是代码的相关部分:

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;

但是 close(sock) 似乎并没有完全关闭并破坏连接,因为在转到“标签”之后,代码正在退出并显示错误消息

Unable to bind: Address already in use

那是连接不再发生。问题是什么?提前致谢。

编辑:我真正想要的是,当我在破坏连接后从头开始运行脚本时,它应该作为一个新程序运行。我该怎么做?

最佳答案

close 调用仅标记 TCP 套接字已关闭。它不再被进程使用。 但内核可能仍会保留一些资源一段时间(TIME_WAIT、2MLS 等)。

SO_REUSEADDR 的设置应该可以消除绑定(bind)问题。

所以在调用 setsockopt 时要确保 true 的值确实是非零的(溢出错误可能会覆盖它):

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

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

关于c - 如何完全破坏C中的套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10619952/

相关文章:

c - 家庭作业 - C 位谜题 - 使用 C 位操作执行 %(无循环、条件、函数调用等)

sockets - FTP 服务器如何恢复下载?

java - 如何让客户端套接字等待服务器套接字

linux - Mercurial 忽略 LInux 上的创建/修改日期更改

linux - 在linux shell脚本中将多行添加到一行中

linux - Node 和 NPM linux 二进制安装

python - Socket.Error : [Errno 10060] when connecting to MQTT broker

c - 将数组传递给方法时使用指针更改数组

无法从 NCURSES 中的标准输入扩展 ASCII 字符读取

C: 我可以使用 libssh 转发外部应用程序的端口吗?