[C] socket - na slackware

0

Witam,

mam maly problem z odebraniem danych po stronie klienta:

po stronie serwera wysylam dane w odpowiedzi do klienta:

send(socket,"TEST", 4,0);
po stronie klienta czekam na odpowiedz:

while (recdata > 0){
  recdata = recv (socket, buffer, BUFFER_SIZE, 0);
  printf("%s", buffer);
}

Problem:
Zadne dane nie zostaja wyswietlone, dopiero jak przerwe polaczenie (odlacze serwer) dane zostaja wyswietlone.
Co jest nie tak? Pod windowsem jakos dzialalo :(
Pomocy bo juz nie mam pomyslow, moze jakas flage trzeba zmienic?
Jak dalem MSG_DONTWAIT to w ogóle nie odbiera nic tylko wychodzi z petli :/

Juz nie wiem co mam zrobic a do rana musze oddac projekt :( help

0

sprobuj dac fflush(stdout); zaraz po printf() - moze po prostu danych do wypisania jest tak malo, ze stdout stwierdzil ze sobie poczeka i w efekcie wypisal je duzo pozniej, dopiero jak cos wiecej wypisano

0

Nie pomaga to, ale martwi mnie jeszcze jedna rzecz. Wydaje mi sie ze czasami serwer nie wysyla tego co powinien.

Jesli np. wysle cos takiego:

write(socket, buffer, strlen(buffer));
write(socket, "123", 3);

To do drugiej strony dochodzi tylko to co jest w buffer, 123 juz nie dochodzi.
Jesli wysle cos takiego:

write(socket, "tutaj tysiac znakow", 1000);
write(socket, "123", 3);

To wszystko dochodzi bez problemu.
Dlaczego czasem nie wysyla drugi raz?
Juz mi normalnie zabraklo pomyslow. HELP ! :(

0

Nie jestem pewny ale czy czasem ta funkcja nie przyjmuje jako 3 parametr rozmiar buffora do wylania ? Jeśli tak to wysyłasz tam ciąg znaków (czyli typu char). Zapis "123" to 3 znaki po 2 bajty, czyli jako trzeci parametr powinieneś dać 6 a nie 3.
Ale mogę się mylić :P

0
Rezor napisał(a)

Nie jestem pewny ale czy czasem ta funkcja nie przyjmuje jako 3 parametr rozmiar buffora do wylania ? Jeśli tak to wysyłasz tam ciąg znaków (czyli typu char). Zapis "123" to 3 znaki po 2 bajty, czyli jako trzeci parametr powinieneś dać 6 a nie 3.
Ale mogę się mylić :P

No masz racje ale char to chyba 1 bajt :-)

0

Poradzilem sobie z tym problemem. Okazalo sie jednak ze trzeba bylo w kilku miejscach dodac jeszcze fflush(). Przy okazji znalazlem jeszcze jeden problem. Podczas gdy serwer odpowiada w kilku iteracjach do klienta wiadomosci sa buforowane i ostatecznie wysylanych jest kilka iteracji za jednym razem. Problem w tym aby odroznic ze to juz jest koniec musze dac znac jakos klientowi. wiec wysylam na koniec specjalnie przygotowana wiadomosc. Do klienta dochodzi ona razem z poprzednimi. Czy da sie to jakos wymusic by wyslal oddzielnie? :-)

0

Nie. Ale zamiast "specjalnie przygotowanej wiadomości" możesz wysyłać z łańcuchem jego znak końca (0) czyli zamiast 'strlen(napis)' dać 'strlen(napis) + 1'. Po stronie klienta odbierać znaki do znaku 0.

0
adf88 napisał(a)

Nie. Ale zamiast "specjalnie przygotowanej wiadomości" możesz wysyłać z łańcuchem jego znak końca (0) czyli zamiast 'strlen(napis)' dać 'strlen(napis) + 1'. Po stronie klienta odbierać znaki do znaku 0.

Bylo by to troche nie wygodne, bo to co wysylam do klienta jest pobierane ze strumienia, musial bym znow to dzielic na pojedyncze znaki.
Juz to zrobilem w inny sposob, moze malo efektywny ale na razie wystarczy.

Sprawdzam kazda otrzymana wiadomosc czy zawiera podciag tych znakow konca nadawania. Problem bedzie jak przypadkiem taki ciag znakow wystapi przypadkiem, ale zakladam ze to jest malo prawdopodobne ;d

dzieki za pomoc

0

ehhh, chodzi o to, aby zamiast "podciag tych znakow konca nadawania" użyć jednego znaku, znaku końca łańcucha '\0'

0
adf88 napisał(a)

ehhh, chodzi o to, aby zamiast "podciag tych znakow konca nadawania" użyć jednego znaku, znaku końca łańcucha '\0'

Hmmm no w sumie racja, ale czy dokladnie ta sytuacja nie jest wykonywana gdy klient sie rozlaczy z serwerem?
Tzn. wtedy chyba jest wysylany tylko pojedynczy 1 znak '\0' bez zadnego buforowania itd.
No ale dobra przetestuje to :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1