Так в чем же разница между этими двумя способами обработки сокетов? - PullRequest
0 голосов
/ 21 мая 2011

решение 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 голосов
/ 02 марта 2012

S1 правильно. Функционально оба одинаковы. S1 прямой, а в S2 вы просто идете окольным путем к S1. fdopen и fileno выдают то же, с чего вы начали ...

socket () или accept () дает вам файловый дескриптор (fd). fdopen () в сокете fd выдает ФАЙЛ * (указатель файла). fileno () в указателе файла возвращает файловый дескриптор fd back. FILE * и fd - это разные способы доступа к одной и той же внутренней структуре (эквивалент open & fopen)

Сокеты двунаправлены, вы читаете и пишете в один и тот же сокет fd. Во втором случае вы разделили сокет fd для чтения и записи. ИМО, вызов к сокету должен иметь чтение fdset и запись fdset отдельно

[скопировал комментарии в ответ как sujjected от @ y26jin]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...