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

标签 c sockets

方案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/

相关文章:

c - 来自两个 3D 点的平面方程以及该平面与点之间的垂直距离

c - 释放内存会导致段错误

c# - 在 C# 中使用 Socket 改进 TCP 转发器

Java,SSLSocket,没有收到任何答复

c# - 我的发送功能(套接字库:system.net&system.net.sockets)有一些错误

c - scanf() 不接受任何输入

c - 为什么此代码会出现段错误?

对这个 while 语句感到困惑

c++ - boost::asio 与标准 C socket 接口(interface)的配合

multithreading - WSA发送到多线程iocp服务器中的所有已连接套接字