Буфер отправки и получения сокета - PullRequest
0 голосов
/ 30 мая 2018

Я попытался узнать о концепции Socket-Send (Receive) -Buffer. И я написал эти коды: Клиент:

int client = socket(AF_INET, SOCK_STREAM, 0);
int s = getsockopt(client, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &len);
int status = connect(client, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
printf("The send buff size is : %d.\n", sendBuffSize);
char buf[100000];
int n, wn;
int fd = open("./1.txt", O_RDONLY);
while ((n = read(fd, buf, sizeof(buf))) > 0) {
    wn = write(client, buf, n);
    printf("Write %d bytes.\n", wn);
}

Сервер: я установил подключенного клиента как Незаблокируйте и добавьте этого клиента в epoll. Как только клиент отправляет данные на сервер, я помещаю основной поток в спящий режим [десять секунд].

char buf[8192];
sleep(10);
int rn;
while ((rn = read(events[i].data.fd, buf, sizeof(buf))) > 0) {
    printf("Read %d bytes.\n", rn);
}

Размер буфера отправки клиента равен 16384.и размер буфера приема сервера равен 20000 [setsockopt].

Согласно книге: клиент вызывает функцию записи, которая блокируется, если буфер отправки сокета заполнен.

Но я получаю результат [Клиент]: Результат

И сервер: Результат

Вопросы:

  1. Размер буфера приема + Размер буфера отправки <100000;но почему функция записи не блокирует? </li>
  2. Почему сервер читает 8192 + 6808 = 15000 байт вместо непрерывного чтения 8192 байт?

1 Ответ

0 голосов
/ 30 мая 2018
  1. Нет никаких свидетельств того, что запись клиента не блокировалась.Напротив, тот факт, что все записи составляли 100 000 байтов, кроме последней, когда вы исчерпали ввод, показывает, что он должен заблокировать, чтобы передать все эти данные в буфер сокетов меньшего размера.

  2. TCP сегментирует и IP-пакеты, данные, передаваемые по проводам.Вы не можете контролировать этот процесс.В любом случае read() может передавать любое количество байтов от 1 до предоставленного счетчика или ноль вверх в неблокирующем режиме.Это потоковый протокол, а не протокол обмена сообщениями.Нет другой гарантии того, сколько человек read() вернет за раз.

...