LINUX.ORG.RU

Буферизация в сокетах ( UNIX domain )


0

0

Требуется, чтобы сервер и клиент в UNIX-домене обменивались
посимвольно. Но я так понял, что по умолчанию используется построчная
буферизация. А возможно ли отменить вообще буферизацию для сокета ?

anonymous

Если не ошибаюсь, есть функция ioctl(), которая настраивает размер буфера для сокета, так что можно установить нужный размер. А вообще-то, почему просто не читать по одному символу из сокета и отправлять все таким же образом.

Supreme
()

В том-то и дело, что отправлять по 1 символу не получается,
соединение висит бесконечно долго, а данные не передаются.
Но стоит после символа вставить \n, данные тутже передаются.
Можно конечно написать прогу так, что бы после каждого символа
вставлять \n, но это как-то не красиво. Должен же быть другой способ.
Попробую с ioctl() поковыряться

anonymous
()
Ответ на: комментарий от anonymous

А ты какими функциями для отправки пользуешься? Там ведь в любом случае надо использовать (char *) для указателя на буфер. Я недавно писал такую прогу правда в домене INET, но по-моему суть дела не меняется, и там у меня все нормально отправлялось по одному символу.

Supreme
()

char ch;
recv(clnt_sock,&ch,1,0) на сервере
send(serv_sock,&ch,1,0) на клиенте
Кстати я обнаружил, что если на perl написать:
if(send(SERVER,$ch,1)){ die $!; }
то выводится ошибка "Operation not supported"
т.е. как-бы и нельзя отправить 1 символ
Если send(SERVER,"$ch\n",2), то все OK

anonymous
()

Сам не юзал, но посмотри опцию SO_RCVBUF и SO_SNDBUF в фунуции setsockopt() - по описанию, "Specifies the size of the receive queue buffer or the send queue buffer for the socket"

Cyberpunk
()

Ага, и еще попробуй сделать так: char *buf; buf=(char *)malloc(1); recv(sock,buf,1,0); на сервере. send(sock,buf,1,0); на клиенте. А насчет setsockopt() святая правда :) Я попутал с ioctl().

Supreme
()

Ну слава богу Вы разобрались. Функция ioctl() - для работы не с sockets а скорее с драйверами.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.