gpt4 book ai didi

c - 那么这2种socket处理方式有什么区别呢?

转载 作者:行者123 更新时间:2023-11-30 18:05:46 24 4
gpt4 key购买 nike

方案1直接处理socket,方案2则先将socket转换为fd,然后再转换为fileno:

S 1:

maxfd = (sock_client > sock_server ) ? sock_client : sock_server;
FD_ZERO(&rfds);
FD_SET(sock_client, &rfds);
FD_SET(sock_server, &rfds);

if ((n = select(maxfd+1, &rfds, NULL, NULL, &timeout)) < 0)
...

S 2:

sockrfp = fdopen( sockfd, "r" );
sockwfp = fdopen( sockfd, "w" );

client_read_fd = fileno( stdin );
server_read_fd = fileno( sockrfp );
client_write_fd = fileno( stdout );
server_write_fd = fileno( sockwfp )


if ( client_read_fd >= server_read_fd )
maxfd = client_read_fd;
else
maxfd = server_read_fd;

FD_ZERO( &fdset );
FD_SET( client_read_fd, &fdset );
FD_SET( server_read_fd, &fdset );

if ((n = select(maxfd+1, &rfds, NULL, NULL, &timeout)) < 0)
...

有什么区别?哪个更好?

最佳答案

S1 是正确的。从功能上来说,两者是相同的。 S1是直达的,而在S2,您只需绕行路线即可到达S1。 fdopen 后跟 fileno 产生的结果与您开始的位置相同...

socket() 或accept() 为您提供一个文件描述符(fd)。套接字 fd 上的 fdopen() 会生成一个 FILE* (文件指针)。文件指针上的 fileno() 会产生一个文件描述符 fd 返回。 FILE* 和 fd 是访问相同内部结构的不同方式(相当于 open 和 fopen)

套接字是双向的,您可以读取和写入同一个套接字 fd。在第二种情况下,您已拆分套接字 fd 进行读写。 IMO,对套接字的调用应该分别读取 fdset 和写入 fdset

[将评论复制到 @y26jin 提出的答案中]

关于c - 那么这2种socket处理方式有什么区别呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6079334/

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