gpt4 book ai didi

c - 如何使用接受和连接调用在同一代码的两个实例之间创建连接

转载 作者:可可西里 更新时间:2023-11-01 02:49:02 25 4
gpt4 key购买 nike

我需要创建一个进程环和一个与环中所有进程相连的主进程。环进程将从主进程获取其左邻居的信息。环进程必须连接到它的左邻居并接受来自右邻居的连接以创建环。

能否请您告诉我如何连接和接受环过程的连接。

这是代码,我已经尽力实现了。首先接受,将使所有进程等待接受请求,而首先连接,将使所有连接被拒绝,因为没有人正在接受请求。

//----------------Connect to Left Neighbour.............

left_sock = socket(AF_INET, SOCK_STREAM, 0);
if (left_sock < 0 )
{
perror("socket Left:");
exit(left_sock);
}

/* set up the address and port */
left_addr.sin_family = AF_INET;
left_addr.sin_port = htons(left_port);
memcpy(&left_addr.sin_addr, left_host->h_addr_list[0], left_host->h_length);

/* connect to socket at above addr and port */
rc = connect(left_sock, (struct sockaddr *)&left_addr, sizeof(left_addr));
if ( rc < 0 )
{
perror("connect Left:");
exit(rc);
}

printf("Connected Left\n");

//----- Accept from Right------
right_sock = socket(AF_INET, SOCK_STREAM, 0);
if (right_sock < 0 )
{
perror("socket right:");
exit(right_sock);
}

/* set up the address and port */
right_addr.sin_family = AF_INET;
right_addr.sin_addr.s_addr = INADDR_ANY;
right_addr.sin_port = htons(right_port);

if (bind(right_sock, (struct sockaddr *)&right_addr, sizeof(right_addr))<0)
{
perror("Right: bind failed");
exit(EXIT_FAILURE);
}

printf("Listener on port %d \n", right_port);

if (listen(right_sock, 10) < 0)
{
perror("Right listen:");
exit(EXIT_FAILURE);
}
int incoming_len = sizeof(incoming);

int p = accept(right_sock, (struct sockaddr *)&incoming, &incoming_len);

if ( p < 0 )
{
perror("Accept:");
exit(p);
}
ihp = gethostbyaddr((char *)&incoming.sin_addr, sizeof(struct in_addr), AF_INET);
printf("Connected to %s\n", ihp->h_name);

最佳答案

标准技术是:

  • 使 left_sock 成为非阻塞的;调用连接;验证 errno == EINPROGRESS
  • right_sock 上调用 listen
  • 调用 select,选择 left_sock 进行写入,选择 right_sock 进行读取。

select 指示可读性时,accept 是安全的(它可能会失败,但不会阻塞)。当select指示可写时,测试SO_ERROR是否为0。继续选择直到确定两个套接字状态。

关于c - 如何使用接受和连接调用在同一代码的两个实例之间创建连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26559405/

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