6.....2
6.....2
#cpp #programowanie i może trochę #sieci
Mireczki, piszę program, który zawiera serwer na socketach. Do wysyłanych danych na początku często dodawane są zera - co może to powodować? Chcę wysłać:
'a' '#'
a wysyła się
'\0' 'a' '#' (ewentualnie dwa zera na początku)
metoda odpowiadająca za wysyłanie danych wygląda tak:
bool ClientSlot::send(string message)
{
if(write(clientSocketId, message.cstr(), message.length())<0)
{
return false;
}
else
return true;
}
sprawdzałem zawartość message.c
str() za pomocą gdb i jest taka jak powinna być.
  • Najlepsze
  • Wszystkie komentarze
6.....2
6.....2
@Likaox: to jest zakończeniem cstringa, pytanie tylko skąd się bierze na początku wysyłanej wiadomości. To też nie jest kwestia błędu po stronie klienta, bo sprawdzałem przez putty.
Likaox
Likaox
@6502: Nie programuje w tym języku ale '\0' chyba jest po prostu zakończeniem cstringu. Nie jestem co do tego pewien ale może warto sprawdzić, czy to nie jest przyczyną.
Ununoctium
@6502:
Nie znam się ani na socketach ani specjalnie na cpp, ale może błąd jest w kodzie który odbiera?
Sprawdzałeś co faktycznie jest wysyłane np. Wiresharkiem?
6.....2
6.....2
@Ununoctium: Sprawdzałem na kliencie, którego napisałem na ESP8266 i na putty
T.....8
T.....8
@6502: Nie powinieneś zfluszować tego streama przed wysłaniem danych?
6.....2
6.....2
@Tenisista88: to nie jest strumień (z tego co się orientuję), więc chyba się nie da
T.....8
T.....8
@6502: To może ten \0 to końcówka poprzedniej wysyłki? Spróbuj message.length() + 1, albo ręcznie usuń ze cstringa ten zakoncznik.
6.....2
6.....2
@Tenisista88: Teraz zauważyłem, że po prostu dodaje '\0' na początku i końcu (a powinno być tylko na końcu). Wiem, że mogę to bez problemu obsłużyć po stronie klienta, ale chcę wiedzieć skąd to się bierze.
T.....8
T.....8
@6502: Na chłopski rozum myślę że ten message.length() daje ci długość stringa bez zakoncznika, ale konwersja w cstr daje ci dodatkowo na końcu tablicy '\0'. Może jakiś efekt uboczny z tym związany. Ekspertem nie jestem.

Idę spać.
rethil
@Tenisista88 endianess leży na pierwszy rzut oka
MickJagger
MickJagger
@6502: nie wiem o co pytasz.
Do odbioru używasz recv(...)? Tam nie ma znaku /0 na końcu.
Jak chcesz wyszukiwać w tym tekście, musisz go sobie sam dodać
Może program którym wysyłasz ci to dodaje? Albo odczujesz ten string do bufora *(buf+1), a wcześniej było tam /0?
6.....2
6.....2
@MickJagger: Problem udało się już rozwiązać - '\0' wysyłał menedżer połączeń pracujący w oddzielnym wątku. Musiałem zmienić sposób sprawdzania, czy klient jest podłączony.