【发布时间】:2012-05-24 02:22:43
【问题描述】:
我在 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
那是连接不再发生。问题可能是什么?提前致谢。
编辑:我真正想要的是,当我在破坏连接后从头开始运行脚本时,它应该作为一个新程序运行。我该怎么做?
【问题讨论】:
-
你为什么要这么做?您应该循环回到
accept之前,而不是重新创建服务器套接字。 -
为什么要关闭并重新打开监听套接字而不是循环
accept()? -
当我这样做时,我得到了回复
You are connected to <ip>, <port>这是我给检查连接是否建立的printf。仅当客户端运行程序时才应建立连接,但即使客户端没有在客户端运行程序也可以建立连接。我现在该怎么办? -
"收到回复你连接到
, "---从哪里来?您的代码不包含该内容。请出示相关代码。
标签: c linux sockets network-programming