[c] nonblocking sockets in winsock

Pagina: 1
Acties:

  • morphje
  • Registratie: Juni 2001
  • Laatst online: 05-09 07:36

morphje

let's all love lain

Topicstarter
Ik heb de godganze www afgezocht voor het maken van non-blocking sockets in winsock.

Voor unix is het heel makkelijk, maar neeeee winsock moet het weer anders.
fcntl(sockfd, F_SETFL, O_NONBLOCK);
Dit vreet borland dus niet, ook niet na het aanroepen van fcntl.h :(

Ik heb een project af te maken, dus zit er hier iemand die het weet, ik zit namelijk flink in de diepe stront

Verwijderd

code:
1
ioctlsocket (sock, FIONBIO, (unsigned long *) 1) ;

dit heb ik letterlijk uit een stukje code van mn buurjongen en wordt hier aangeroepen na connect. Ik hoop dat je er wat aan hebt.

  • morphje
  • Registratie: Juni 2001
  • Laatst online: 05-09 07:36

morphje

let's all love lain

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  ioctlsocket (incoming, FIONBIO, (unsigned long *) 1) ;
  ioctlsocket (new_fd, FIONBIO, (unsigned long *) 1) ;
  while (stop!=1)   // main loop
    {
     sel_val=recv(new_fd,buffer,sizeof(buffer), 0);
     printf("bla");
     if (sel_val==0)  //client hangup
       {
         printf("client hangup");
         stop=1; //ga uit main loop en sluit af
       }
     if (sel_val==-1)    //mogelijke fout of WSAEWOULDBLOCK
       if (errno!=WSAEWOULDBLOCK) // is het een echte fout?
         {
         MessageBox( NULL, "recv error", "Fout", MB_OK|MB_ICONERROR );
         perror("recv");
         getch();
         exit(1);
         }
     if (sel_val>0)     //data om te verwerken
       { //de rest enzo

Wat doe ik hier fout, hij blocked die file descriptor gewoon. en ik hij print pas bla bij het ontvangen van data en zit daarna gewoon weer vrolijk te blocken :(

ps. heb nu me main fd en me new_fd allebij non-blocking gemaakt en ik heb ze apart geprobeert, helpt voor geen ene meter

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op maandag 11 maart 2002 20:57 schreef Prommie het volgende:
code:
1
ioctlsocket (sock, FIONBIO, (unsigned long *) 1) ;

dit heb ik letterlijk uit een stukje code van mn buurjongen en wordt hier aangeroepen na connect. Ik hoop dat je er wat aan hebt.
Schup die buurjongen eens voor z'n gat 8-)

Klinkt dit niet wat waarschijnlijker:
code:
1
2
3
4
5
6
u_long  l_Value = TRUE;

if(ioctlsocket(MySocket, FIONBIO, &l_Value) == SOCKET_ERROR)
  {
  // Handle error using WSAGetLastError()
  }

Pointer naar geheugenadres 1 is puur toeval of je daarna al of niet blockt (of een access violation krijgt :P ).

[edit]
Zie net dat je 'm ook nog NA connect aanroept...? :? Zou je dat niet ervoor doen?

Professionele website nodig?


  • morphje
  • Registratie: Juni 2001
  • Laatst online: 05-09 07:36

morphje

let's all love lain

Topicstarter
Ik heb geen connect, want dit is een deamon.

mijn volgorde atm:
WSAStartup();
socket();
bind();
listen();
accept();
en dan me non-blocking toestand

Ik heb nog wel wat voorbeelden gevonden betreffende non-blockingsockets, en daar gebruiken ze ook 1, dus dat zal wel kloppen.

Maar iklees hier: (beej network programming guide)
socket();
fcntl(blablabla); (wat dus nu ioctlsocket geworden is :))

nou heb ik die ioctlsocket op verschillende plaatsen gezet, mocht niet baten. Ben aardig, ik heb hem op website gezet.
www.clan-dsk.com/morphje/selectserver8.c misschien dat jij het ziet, ik iig niet :)

Maar als ik het goed begrijp non-blocking socket is gewoon kijken of er data is, zo niet return -1 en errn=WSAEWOULDBLOCK, en continue recv aanroepen, data nee, error, verwerk, data ja? verwerk data en ga verder ....

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op maandag 11 maart 2002 23:20 schreef morphje het volgende:
Ik heb geen connect, want dit is een deamon.
Die kennen we niet onder Windows... da's een service. :Y)
Maar als ik het goed begrijp non-blocking socket is gewoon kijken of er data is, zo niet return -1 en errn=WSAEWOULDBLOCK, en continue recv aanroepen, data nee, error, verwerk, data ja? verwerk data en ga verder ....
Nope je begrijpt het niet goed O+ Ga eens docs nalezen op select voor Unix-style non-blocking sockets, of naar de WSAOVERLAPPED structuur voor Win32-style.

Professionele website nodig?


  • morphje
  • Registratie: Juni 2001
  • Laatst online: 05-09 07:36

morphje

let's all love lain

Topicstarter
ik heb 7 keer een "service" proberen te schrijven met select. die wil gewoon niet meewerken.

als volgt, ik neem select en laat hem mijn set aflopen met een time-out van 0, dus hij timed direct out. Nu heb ik ook een paar andere timers, bijvoorbeeld actietemptijd die bepalen wanneer het volgende tijdstip is wanneer de temp 1 graad verhoogt of verlaagt moet worden.

De actietemptijd var gaat goed, maar zodra ik actiedruktijd (de tijd waarbij er iets met druk moet gebeuren) gebruik, geeft select een error. Net of select die timer niet leuk vind, maar het is gewoon een standaard unsigned long en heeft helemaal niks te maken met de struct timeval.

Snap jij het nog? ik niet.
www.clan-dsk.com/morphje/selectserver6.c dat is de link voor mijn beste select poging, gaat goed, zolang ik actiedruktijd niet gebruik.

Dus als ik niet kan nonblocken en niet kan selecten, hoe kan ik dan nu verder werken?

  • morphje
  • Registratie: Juni 2001
  • Laatst online: 05-09 07:36

morphje

let's all love lain

Topicstarter
Nou ik ben er helemaal uit.
Wat blijkt dus toch het volgende te zijn:
code:
1
2
3
4
5
6
7
  u_long nNoBlock = 1; 
  errorcode= (ioctlsocket (incoming, FIONBIO, &nNoBlock)) ;
  printf("%d", errorcode);
  if (errorcode==-1) WSAGetLastError();
  errorcode= (ioctlsocket (new_fd, FIONBIO, &nNoBlock)) ;
  printf("%d", errorcode);
  if (errorcode==-1) WSAGetLastError();

Op het moment heb ik geen tijd meer om betere (effectievere)errorchecking erin te zetten, het werkt op het moment en fouten verbeter ik wel in versie 1.1b (of versie 2.0b want het word waarschijnlijk toch wel een rewrite :))

Ieder dank voor de hulp en ook dank aan alt.winsock.programming
Pagina: 1