解决方案1直接处理socket
,而解决方案2首先将套接字转换为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)
...
有什么区别?哪个更好?
答案 0 :(得分:0)
S1是正确的。在功能上,两者都是相同的。 S1是直接的,在S2中,你只需走一条通往S1的迂回路线。 fdopen后跟fileno会产生与你开始时相同的内容......
socket()或accept()为您提供文件描述符(fd)。套接字fd上的fdopen()会产生一个FILE *(文件指针)。文件指针上的fileno()会返回一个文件描述符fd。 FILE *和fd是访问相同内部结构的不同方式(相当于open&amp; fopen)
套接字是双向的,您可以读取和写入相同的套接字fd。在第二种情况下,您已将套接字fd拆分为read&amp;写。 IMO,对socket的调用应该已经读过fdset&amp;写fdset分开
[将评论复制到@ y26jin所支持的答案]