Har*_*nan 22 c sockets linux network-programming
我使用socket在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;
Run Code Online (Sandbox Code Playgroud)
但是关闭(袜子)似乎并没有完全破坏连接,因为在去'标签'之后代码正在退出显示错误信息
Unable to bind: Address already in use
Run Code Online (Sandbox Code Playgroud)
这就是连接没有再次发生.问题是什么?提前致谢.
编辑:我真正想要的是,当我在破坏连接后从头开始运行脚本时,它应该作为一个新程序运行.我该怎么做?
SKi*_*SKi 31
该close
调用仅标记TCP套接字已关闭.它不再被进程使用.但是内核可能仍会保留一段时间的某些资源(TIME_WAIT,2MLS等东西).
设置SO_REUSEADDR应该删除绑定问题.
因此,请确保true
调用时值为非零setsockopt
(溢出错误可能会覆盖它):
true = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))
Run Code Online (Sandbox Code Playgroud)
pid
你的代码有变量.如果您使用fork
(用于启动连接处理过程),那么您sock
也应该在不需要它的过程中关闭.
首先是名称,所以我们都将相同的名称命名为:
服务器端:
套接字传递给listen()
然后accept()
让我们调用监听套接字.accept()
let 返回的套接字调用接受的套接字.
客户端:
传递给套接字connect()
让我们调用连接/连接套接字.
关于你的问题:
要终止accept()
ed连接,请先关闭接受的套接字(所谓的连接),shutdown()
然后再使用close ()
.然后,为了接受新的连接环调用前右后卫accept()
,不通过走bind()
和listen()
试.
如果要删除返回后发出的待处理 connect()
s,请仅关闭并关闭侦听套接字accept()
.
连接仍然处于活动状态,因为您忘记关闭连接的套接字。关闭监听套接字不会自动关闭连接的套接字。
//necessary code
close(connected); // <---- add this line
close(sock);
goto label;
Run Code Online (Sandbox Code Playgroud)
我不确定你为什么会得到 EADDRINUSE。该代码在 linux 和 mac os 上运行良好。