gpt4 book ai didi

c - 传输端已连接错误: 106 with connect()

转载 作者:行者123 更新时间:2023-11-30 16:34:14 25 4
gpt4 key购买 nike

我已经开始使用 SOCK_STREAM 类型的 UNIX 域套接字实现服务器-客户端模型。

提前致谢

最佳答案

如果您的套接字已经连接,您需要避免再次连接,您可以在客户端代码中保留一些标志,指示您的客户端套接字是否已经连接,基于跳过再次连接。

我在下面编辑了您的服务器代码,以显示我想在评论中说的话(您也需要将接受的 fd 放入选择读取集中,以便您可以检查任何发布任何数据的客户端,而且您有多个客户端连接到您,因此您必须将接受的套接字保留在数组中):

int cltfdlen = 0;
int cltfds[FD_SETSIZE];
int maxFD = sockfd;
int sun_path_size = sizeof(client_address.sun_path);
client_address.sun_family = AF_UNIX;
strncpy(client_address.sun_path, SOCKET_NAME, sun_path_size);
client_len = sizeof(client_address);

cli_interval.tv_sec = 60;
cli_interval.tv_usec = 0;

while (1) {

FD_ZERO(&read_fds);
FD_SET(sockfd, &read_fds);
for(i=0;i<cltfdlen;cltfdlen++)
FD_SET(cltfds[i], &read_fds);
int activity = select(maxFD + 1, &read_fds, NULL, NULL, &cli_interval);

if ((activity < 0) && (errno !=EINTR)) {
printf("socket select failed errno %d\n", errno);
return 1;
}

if (FD_ISSET(sockfd, &read_fds)) {
cli_sockfd = accept(sockfd,
(struct sockaddr *)&client_address,
&client_len);
if(cli_sockfd < 0) {
printf("accept from IPC socket failed");
return 1;
}
else
{
cltfds[cltfdlen++] = cli_sockfd;
if(maxFD < cli_sockfd)
maxFD = cli_sockfd
continue;
}
}
msg = (msg_t *) malloc(sizeof(msg_t));
if (msg == NULL) {
printf("Memory allocation failed for msg");
close(ipc_sockfd);
ipc_sockfd = -1;
return 1;
}

memset(msg, 0, sizeof(msg));
for(i=0;i<cltfdlen;i++)
{
if(FD_ISSET(cltfds[i], &read_fds))
{
if (read(cltfds[i], (void *)msg, sizeof(msg_t)) == -1) {
printf("Read from IPC socket failed");
return 1;
}
}
}

close(cli_sockfd);
cli_sockfd = -1;

}

关于c - 传输端已连接错误: 106 with connect(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com