如何完全破坏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;

但是close(sock)似乎并没有完全关闭销毁连接,因为进入“标签”之后,代码将退出并显示错误消息

Unable to bind: Address already in use

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

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

回答:

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

设置SO_REUSEADDR应该可以消除绑定问题。

因此请确保true调用时的值实际上非零setsockopt(溢出错误可能会覆盖它):

true = 1;

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))

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

以上是 如何完全破坏C中的套接字连接 的全部内容, 来源链接: utcz.com/qa/398039.html

回到顶部