LINUX.ORG.RU

TCP Socket i buffer


0

0

Privet vsem.

Problema v sleduus4em. Otkrivaiu TCP stream socket. Posilaiu paket s pomos4iu send(). Ne zavisimo ot togo, podkliu4en li 6nur seti mne vozvras4aet koli4estvo poslannih bait. Esli eto buffer, to kak mne ego otkliu4it' i real'no uznat', otoslal ia paket ili net? Zaranee blagodaren.

Re: TCP Socket i buffer

Придумай протокол с подтверждением получения. Иначе - никак.

baklan ()

Re: TCP Socket i buffer

фигня какаято. код покажи?

Vinill ★★ ()

Re: TCP Socket i buffer

nu konechno! send() failit'sya tol'ko togda kogda u tebya perepolnilsya wnutrenniy buffer socketa (SO_SNDBUF sockopt). Uznat' o tom 4to twoi dannye blagopoluchno dostawleny w socket API naskol'ko ya znayu nel'zya ..

ya ne sowsem ponyal 4to ty hochesh' goworya ''otklyuchit' buffer'', wozmozhno ty ne hochesh' ispol'zowat' Nagle algoritm (posylka po mere dostawki)? chtoby otklyuchit' Nagle algoritm prostaw' TCP_NODELAY sockopt

udachi!

lg ★★ ()
Ответ на: Re: TCP Socket i buffer от lg

Re: Re: TCP Socket i buffer

при оторванном сокете с неотключенным SIGPIPE программа просто вывалится в core. так что код покажи всетаки.

Vinill ★★ ()
Ответ на: Re: Re: TCP Socket i buffer от Vinill

TCP Socket i buffer

void *socketKamelot()
{
int result1;
struct sockaddr_in serv_add;
int statusSocket=0;
Command cmd;

while (1)
{
if ((sockKam = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
statusCerberus.statusKamelot =0;
perror("Socket kamelot creation error");
logAdd("Socket creation error");
}
else
statusSocket =1;
memset((void *) &serv_add, 0, sizeof(serv_add));
serv_add.sin_family = AF_INET;
serv_add.sin_port = htons(cfgCerberus.port);
if ((inet_pton(AF_INET, cfgCerberus.ipK, &serv_add.sin_addr)) <= 0)
{
perror("Address creation error");
logAdd("Address creation error");
statusSocket=0;
}
else
statusSocket=1;
if (statusSocket ==1)
if ( connect(sockKam, (struct sockaddr *) &serv_add, sizeof(serv_add)) < 0)
{
perror("Connection kamelot error");
logAdd("Connection kamelot error");
statusCerberus.statusKamelot=0;
}
else
{
statusCerberus.statusKamelot=1;
statusLed=led(statusLed,1,1);
}
while (1)
{
if (statusCerberus.statusKamelot == 0)
break;
cmd=cmdNew(78,3,0,2,cfgCerberus.idCerberus,"",VERSION,"Identif&qu ot;,"Cerberus");
result1=send(sockKam,&cmd,sizeof(Command),0);
while (1)
{
result1 = recv(sockKam, &cmd, sizeof(Command),0); // ogidaet commandi
if (result1 <= 0)
{
statusCerberus.statusKamelot=0;
logAdd("Kamelot disconnected.");
break;
}
...

virgin13 ()
Ответ на: Re: Re: TCP Socket i buffer от Vinill

Re: Re: Re: TCP Socket i buffer

Если интерфейс был поднят раньше чем выдернут шнур, то tcp будет пробовать доставить данные пока не истечет таймаут. Так что не надо ляля про SIGPIPE.

OxiD ★★★★ ()

Re: TCP Socket i buffer

И еще. Ошибки записи возвращаются при чтении. ТО есть ( не в твоей ситуации) если ты отправил пакет хосту, который только что закрыл соединение, ты узнаешь о неудаче только при recv()

OxiD ★★★★ ()
Ответ на: tcp socket от virgin13

Re: tcp socket

Лучше используй heartbeat, а сенд штука хорошая. ведь повреждение в сети может быть временным. и через минут исправиться.

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