gpt4 book ai didi

C - 使用轮询在套接字和标准输入之间多路复用 - 服务器

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:14 24 4
gpt4 key购买 nike

我正在编写一个客户端服务器应用程序,我正在使用轮询在多个客户端套接字和标准输入之间进行多路复用,我可以在其中插入命令(例如:停止服务器)。我相信我的代码的结构(“逻辑”)是正确的,但它的行为方式与我期望的不同:

struct pollfd pfd[NSERVER]; //defined as 10
pfd[0].fd = fileno(stdin);
pfd[0].events = POLLIN;
pfd[1].fd = socktfd; //server bind, listen socket
pfd[1].events = POLLIN;
struct sockaddr_storage remoteaddr; // client address
socklen_t addrlen;
char remoteIP[INET6_ADDRSTRLEN];
addrlen = sizeof remoteaddr;
char buf[1024]; // buffer
int pos=2;

while(poll(pfd,1,0) >= 0)
{
if(pfd[0].revents & POLLIN) { //stdin
//process input and perform command
}
if(pfd[1].revents & POLLIN) {
/* new connection */
int connsockfd = accept(socktfd, (struct sockaddr *)&remoteaddr,&addrlen);
pfd[pos].fd=connsockfd;
}
int i=2;
//Loop through the fd in pfd for events
while (i<=NSERVER)
{
if (pfd[i].revents & POLLIN) {
int c=recv(pfd[i].fd, buf, sizeof buf, 0);
if(c<=0) {
if (c==0)
{
/* Client closed socket */
close(pfd[i].fd);
}
}else
{//Client sent some data
c=send(pfd[i].fd,sbuff,z,0);
if (c<=0)
{
Error;
}
free(sbuff);
}
}
i++;
}
}

我删除了 recv 和 send 中的一些代码,以使代码更易于阅读。它无法正常运行(它只是挂起,不接受连接或对来自标准输入的输入使用react)。

注意:我更愿意使用 poll 而不是 select,所以请不要指向 select :-)。

在此先感谢您的帮助。

最佳答案

  1. 你应该设置每个pfd[i].fd = -1 ,因此它们最初会被 poll() 忽略。
  2. poll(pfd, 1, 0)是错误的,至少应该是 poll(pfd, 2, 0)甚至 poll(pfd, NSERVER, 0) .
  3. while(i<=NSERVER)应该是 while(i<NSERVER)

您的程序可能会挂起,因为您遍历了 pfd 数组,该数组未初始化且包含 .fd 和 .revents 的随机值,因此它想在某个可能阻塞的随机 FD 上发送 () 或 recv()。做if(pdf[i].fd < 0) {i++; continue;}i<NSERVER循环。

你也没有设置 pfd[pos].events = POLLIN在新接受的套接字上。不要设置 POLLOUT除非你有东西要发送,因为它几乎每次都会触发。

关于C - 使用轮询在套接字和标准输入之间多路复用 - 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13900984/

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