Nowe posty

Autor Wątek: brak SOL_TCP i SO_NODELAY  (Przeczytany 5052 razy)

froger_666

  • Gość
brak SOL_TCP i SO_NODELAY
« dnia: 2009-10-10, 03:06:48 »
Witam!

Poniższy kod się nie kompiluje - nie widzi SOL_TCP oraz SO_NODELAY (co jest efektem nie-widzenia SOL_TCP)

  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if(sockfd < 0)
  {
    return EXIT_FAILURE;
  }
    //ustawianie gniazdka
  int mainsocketoption = 1;
  setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &mainsocketoption, sizeof(int));
  setsockopt(sockfd, SOL_TCP, SO_NODELAY, &mainsocketoption, sizeof(int));
błędy:

src/main.cpp:272: error: ‘SOL_TCP’ was not declared in this scope
src/main.cpp:272: error: ‘SO_NODELAY’ was not declared in this scope
Po zastąpieniu SOL_TCP 6tką, nadal nie widzi SO_NODELAY.

Używam debiana.

Z góry dziękuję za pomoc


//EDIT:
za pomocą grepa znalazłem coś takiego jak

#define DSO_NODELAY 12

w pliku /usr/include/linux/dn.h

Tym sposobem, po zaincludowaniu tego pliku moge uzyc DSO_NODELAY (a chodzilo o SO_NODELAY), ale nie jestem pewien czy to aby na pewno dobre rozwiązanie - czy teraz setsockopt będzie wiedział o co chodzi, czy po prostu ustawi wartość bez ogladania się na rezultaty...

//EDIT 2:
po rozwiązaniu innych błędów w kodzie - rozwiązanie z #EDIT się nie kompiluje. Chyba jednak będę musiał zrezygnować z SO_NODELAY ;/

zastosowania

  • Gość
brak SOL_TCP i SO_NODELAY
« Odpowiedź #1 dnia: 2009-10-10, 21:34:25 »
1. jakiego masz kernela na tym debianie
2. jakie includy dolaczasz do zrodelka ?

- wydaje sie, ze lepiej to bedzie zrobic na udp a nie tcp ... :o]

pozdrawiam

froger_666

  • Gość
brak SOL_TCP i SO_NODELAY
« Odpowiedź #2 dnia: 2009-10-11, 00:36:13 »
1. kernel z serii 2.6.26-2 (amd64)
2. sys/socket.h, sys/types.h, linux/socket.h , linux/types.h

Przyjżałem się teraz plikowi linux/socket.h.

Jest tam na poczatku linia:

#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)

I problem w tym, że żaden z warunków u mnie nie jest spełniony ...
__GLIBC__ > 2, jest definicja __GLIBC__, natomiast __KERNEL__ nie jest zdefiniowany ...

froger_666

  • Gość
brak SOL_TCP i SO_NODELAY
« Odpowiedź #3 dnia: 2009-10-21, 01:18:30 »
chyba solved - wiecej powiem po testach.
Wystarczy dolaczyc

#include "/usr/include/netinet/tcp.h"

//EDIT: co jest rownoznaczne , jednakże lepiej uzywac wlasnie tego zapisu co: #include

i zaczyna chodzić.

Jeżeli sie mylę - niech ktoś mnie z błędu wyprowadzi ...

//EDIT2

aktualnie ustawiam tworze socket i ustawiam opcje tak:

  sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(sockfd < 0)
  {
    return EXIT_FAILURE;
  }
  //ustawianie gniazdka
  int mainsocketoption = 1;
  setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &mainsocketoption, sizeof (int));
  setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &mainsocketoption, sizeof (int));
  int flags;
  /* Set socket to non-blocking */
  if((flags = fcntl(sockfd, F_GETFL, 0)) < 0)
  {
    close(sockfd);
    return EXIT_FAILURE;
  }

  if(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0)
  {
    close(sockfd);
    return EXIT_FAILURE;
  }
Dla przyłączonych gniazd robie analogicznie (w wątku)

Jednakże nadal nie osiągnąłem tego o co chodziło - pakiety są nadal "sklejane" - a zależało mi na wysyłaniu po pakiecie (coś jak UDP, tylko z komfortem TCP) ponieważ wysyłane pakiety są krótkie (10-300 bajtow) a zależy mi na prędkości transmisji (każdy z tych pakietów odpowiada za co innego, więc istnieją logiczne przesłanki aby dochodziły szybciej i w pojedynczych paczkach). Klientem jest program pisany w Adobe AIR, więc użycie strikte UDP nie wchodzi w rachubę - brak obsługi.

Próbowałem też ustawiać SNDBUF na długość pakietu do wysłania - jednakże wysyłał tylko 3-4 pakiety i przestawał ....

pakiety wysyłam z petli (w watku) ktora wyglada mniej-wiecej tak:

for(int i=0;i{
Message = "asd"+intToStr(i);
write(clientfd, Message.c_str(),Message.length());
}
//kod poglądowy - myśle ze widac o co chodzi ;)

aha.
opcja
SO_NODELAY nadal mi się nie pojawia. Mozecie sprawdzic u siebie jaki wynik daje:

find /usr | xargs grep "SO_NODELAY"
u mnie zajduje jedynie definicje DSO_NODELAY (pisalem juz wyzej)

Pozdrawiam!