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