c - 每个客户端可以有多个套接字文件描述符吗?
问题描述
我正在编写一个服务器程序和一个客户端程序。由于客户端进程可以是无限的(它只在中断后结束),我想我可以在客户端进程中创建一个thread
在服务器进程断开连接时断开自身,因此服务器可以向客户端发送消息以断开连接客户也是。
这里的问题是,将客户端连接到服务器只返回一个套接字文件描述符,当服务器断开连接并使用套接字缓冲区中的一些数据时,它可以使用,因此会对程序的主要目的产生负面影响,所以我想对服务器使用另一个套接字文件描述符来断开连接thread
。我怎样才能做到这一点?
这是我用来连接两个进程的函数:
服务器:
int socketConfig (connection_info cinfo) {
int socketfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketfd < 0) {
write(1, "Socket error\n", strlen("Socket error\n"));
return -1;
}
struct sockaddr_in s_addr;
memset (&s_addr, 0, sizeof (s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(cinfo.port);
s_addr.sin_addr.s_addr = INADDR_ANY;
if (bind (socketfd, (void *) &s_addr, sizeof (s_addr)) < 0) {
write(1, "Bind error\n", strlen("Bind error\n"));
return -1;
}
listen(socketfd, 3);
return socketfd;
}
int receiveClient(int serverfd) {
struct sockaddr_in client;
socklen_t len = sizeof(client);
return accept(serverfd, (void *) &client, &len);
}
客户:
int connect_to_server(Config config) {
struct sockaddr_in client;
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
write(1, "Connecting Jack...\n", strlen("Connecting Jack...\n"));
if (sockfd < 0) {
write(1, "Error creating the socket\n", strlen("Error creating the socket\n"));
return -1;
}
memset(&client, 0, sizeof(client));
client.sin_family = AF_INET;
client.sin_port = htons(config.port_jack);
if (inet_aton(config.ip_jack, &client.sin_addr) == 0) {
write(1, "Invalid IP address\n", strlen("Invalid IP address\n"));
return -1;
}
if (connect(sockfd, (void *) &client, sizeof(client)) < 0) {
write(1, "Error connecting to Jack\n", strlen("Error connecting to Jack\n"));
return -1;
}
return sockfd;
}
解决方案
服务器在关闭连接时不需要“发送消息”,TCP/IP 堆栈会为您执行此操作。
那么客户端在进行读取的时候会收到0个字节来表示对方关闭了连接。不需要单独的插座。
推荐阅读
- javascript - Mapbox - 激活位置时无法移动标记
- python - 在 Python 中维护来自 Kafka 更新消息流的表的最佳数据结构
- r - R得到非常小的数字而不是零
- jsonschema - 如何子类化 JSON 模式
- c# - 在 c# 中用于繁重 IO 操作的线程类型
- c# - 在 ASP.Net Core 3.1 API 中记录响应正文
- javascript - 从带有未定义标题的事件中删除连字符 (Fullcalendar)
- javascript - img 元素在 Ionic React 中不起作用
- java - FireBase getUid 在返回值后返回 Null
- python - 绘制跨越子午线和日期变更线的全局轮廓数据