Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 那么这两种套接字处理方式之间有什么区别呢?_C_Sockets - Fatal编程技术网

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

C 那么这两种套接字处理方式之间有什么区别呢?,c,sockets,C,Sockets,解决方案1直接处理套接字,而解决方案2首先将套接字转换为fd,然后再转换为fileno: S 1: 第2条: 有什么区别?哪一个更好?S1是正确的。在功能上,两者是相同的。S1是直接的,在S2中,你只需要走一条迂回的路线到S1。fdopen后跟fileno会产生与开始相同的结果 socket或accept为您提供文件描述符fd。套接字fd上的fdopen fd生成一个FILE*文件指针。文件指针上的fileno返回文件描述符fd。FILE*和fd是访问同一内部结构的不同方式,相当于open&fo

解决方案1直接处理套接字,而解决方案2首先将套接字转换为fd,然后再转换为fileno:

S 1:

第2条:


有什么区别?哪一个更好?

S1是正确的。在功能上,两者是相同的。S1是直接的,在S2中,你只需要走一条迂回的路线到S1。fdopen后跟fileno会产生与开始相同的结果

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

套接字是双向的,您可以对同一个套接字进行读写。在第二种情况下,您已经拆分了用于读写的套接字fd。依我看,对套接字的调用应该将读fdset和写fdset分开


[根据@y26jin的提问将评论复制到答案中]

S1是正确的。在功能上,两者是相同的。S1是直接的,在S2中,你只需要走一条迂回的路线到S1。fdopen后面跟fileno的结果和你开始时一样…@hackworks,你能更详细地解释一下,然后把它作为一个答案发布吗?你的意思是服务器读取fd与服务器写入fd相同,因为它们都是从sockfd生成的吗?@compile fan:socket或accept为你提供一个文件描述符fd。套接字fd上的fdopen fd生成一个FILE*文件指针。文件指针上的fileno返回文件描述符fd。FILE*和fd是访问相同内部结构的不同方式,相当于open&fopen。@hackworks,很高兴知道。因此,这里的server\u read\u fd与server\u write\u fd是相同的,因为它们都是从sockfd生成的?@compile fan:套接字是双向的,您可以读写同一个套接字fd。在第二种情况下,您已经拆分了用于读写的套接字fd。依我看,对套接字的调用应该有读fdset和写fdset分隔符。
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)
...
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)
...