那么这两种套接字处理方式有什么区别呢?

时间:2011-05-21 03:00:21

标签: c sockets

解决方案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)
...

有什么区别?哪个更好?

1 个答案:

答案 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所支持的答案]