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.

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

baklan
()

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

Vinill ★★
()

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 ★★
()
Ответ на: комментарий от Vinill

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
() автор топика
Ответ на: комментарий от Vinill

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

OxiD ★★★★
()

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

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

tcp socket

Rebiata, vsem spasibo, na6el sposob. Pered otpravleniem paketa delaiu kontrol' na sostoianie seti. Vrode, rabotaet. Hotia, na s4et send, nemnogo razo4arovan, dumal o nem lu46e...

virgin13
() автор топика
Ответ на: tcp socket от virgin13

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

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