Максимальная длина буфера в сокете AF_UNIX - PullRequest
4 голосов
/ 16 июня 2010

Я хотел бы знать: при программировании на C с использованием сокета (AF_UNIX) существует ли ограничение (в байтах) при отправке или получении в или из сокета?

Ответы [ 2 ]

6 голосов
/ 16 июня 2010

Вы можете изменить буферы чтения и записи для каждого отдельного соединения сокета, используя setsockopt (SO_SNDBUF и SO_RCVBUF).

Размер по умолчанию и максимальный размер зависят от платформы.

Кроме того, если вы предоставляете больший пользовательский буфер для каждого отдельного чтения, например, с recv.

И если вы используете несколько recv споследовательность, вы можете прочитать бесконечное количество байтов через соединение, это займет бесконечно много времени.

0 голосов
/ 16 июня 2010
Поведение сокетов

зависит от реализации.В целом, когда вы отправляете (), нет гарантии, сколько байтов будет помещено в сокет.Так как ядро ​​контролирует это, оно может быть любым числом, обычно в диапазоне 1500 или меньше.Итак, вам нужно проверить код возврата send () и продолжать помещать данные в сокет, пока вы не закончите.В этом примере предполагается, что вы уже установили неблокирование сокета с помощью:

 fcntl(s, F_SETFL, O_NONBLOCK);


int sendall(int s, char *buf, int *len)
{
        int total = 0;        /* how many bytes we've sent */
        int bytesleft = *len; /* how many we have left to send */
        int n=0;
        int retries=0;
        struct timespec tp={0,500};

        while(total < *len) 
        {
                n = send(s, buf+total, bytesleft, 0);
                if (n == -1)
                {
                   /* handle errors here, 
                      plus check for EWOULDBLOCK 
                      and then nanosleep()
                   */
                }
                total += n;
                bytesleft -= n;
        }

Чтобы ответить на ваш вопрос - нет ограничений, вы просто не можете отправить все свои данные одним вызовом send ().

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