Avatar billede jhald Nybegynder
28. februar 2003 - 08:01 Der er 15 kommentarer

C Socket

Jeg er lige gået i gang med at lære mig en smule C - jeg vil gerne ha' en socketforbindelse til at køre (i første gang bare en client socket, men senere skal jeg også ha' en server socket til at virke)

Jeg har fået lavet en socket forbindelse af en slags - hvilket vil sige at jeg godt kan få den til at læse eller skrive over en socket, det er jo også en fin nok start..

mit problem er at jeg kender til andre programmeringssprog, der gælder det at der er en event, hvor der sker ting - OnSocketRead - eller hvad de forskellige sprog nu vælger at kalde det..

I C skal man, så vidt jeg har set, ha' en do {} while for at få det til at virke.

Mit problem er at det kommer til at virke 'blocking' når jeg laver noget.

Altså.. hvis vi nu antager at jeg vil ha' lov til at køre f.eks. en irc-klient - så skal den hele tiden læse fra socket - men den skal også kunne reagere på det jeg skriver til den.
Som jeg har fået det til at virke, så går den i stå, mens den venter på at jeg skriver noget - hvilket vil sige at hvis jeg ikke skriver noget konstant, så bliver der ikke læst fra socket'en.

Nogle der har nogle eksempler på hvordan det skal laves (antager at det kun er noget inden for do{}while jeg skal ha fat i)

og nej, jeg er ikke interesseret i nogle lib's der er specielt rettet mod irc, det er et generelt socketspørgsmål :)


(og nej vil ikke ha' af vide at jeg hellere skulle lære C++, det kommer jeg måske til på et senere tidspunkt)
Avatar billede segmose Nybegynder
28. februar 2003 - 08:47 #1
Kode ordene må være:

socket - det er muligt at sætte timeout til 0. (gælder vist ikke winsock?)

tråde - så man kan lade den ene vente på at der kommer noget.
Avatar billede jhald Nybegynder
28. februar 2003 - 09:48 #2
tråde lyder fornuftigt, ja - hvordan bruger man dem i C ?

og hvordan winsock har det med det er irrelevant, jeg vil køre det på en bsd maskine - men det er når den venter på input fra mig/stdin at den 'går i stå' - så timeout på socket'en's timeout er vel ikke så relevant?
det skal vel nærmere være en stdin timeout - det lyder bare grotesk..

tror bestemt det er tråde der er tricket :)
Avatar billede segmose Nybegynder
28. februar 2003 - 11:26 #3
Søg efter posix thread.

Så er dit problem at bruger input blokere for din kommunikation,
det løses ved at have 2 tråde der begge blokere på henholdsvis
input og socket og venter på at der sker noget.

Se også:
http://www.eksperten.dk/spm/143519
Avatar billede hsloth Novice
28. februar 2003 - 16:00 #4
En anden mulighed er at bruge et select - så kan du vente på både input fra en tråd, og input fra keyboardet.
Avatar billede segmose Nybegynder
28. februar 2003 - 20:38 #5
selvfølgelig hedder det select! hvilket viser hvor meget jeg har brugt der :)
Avatar billede tam Nybegynder
01. marts 2003 - 00:22 #6
Hmmm, koder du til windows, der er en del forskel på *nix og windows socket.

Hvis du snakker windows kunne du kigge her: http://www.codeproject.com/internet/winsockintro02.asp
Avatar billede jhald Nybegynder
05. marts 2003 - 11:54 #7
det var til freebsd, hvilket vil sige *nix...

jeg har ledt efter nogle posix ting - har også fået set andre steder at det tyder på at være det helt rigtige at bruge..

de eksempler jeg prøvet har
Avatar billede jhald Nybegynder
05. marts 2003 - 11:58 #8
nå, den ville ikke ha' resten med... kommer her:

#include <pthread.h>

hald@freebsd ~/c/threads #gcc hello.c
/tmp/ccsefWif.o: In function `main':
/tmp/ccsefWif.o(.text+0x36): undefined reference to `pthread_create'
/tmp/ccsefWif.o(.text+0x4a): undefined reference to `pthread_exit'
/tmp/ccsefWif.o: In function `thrdfun':
/tmp/ccsefWif.o(.text+0x7a): undefined reference to `pthread_exit'

jeg er ganske usikker på hvad det skyldes... at pthread_exit og create ikke findes i den .h der er included, eller ?

er der flere versioner af den, eller sådan noget?

nogle der har et eksempel der virker og kan kompileres, som jeg kan glo på ?
Avatar billede hsloth Novice
05. marts 2003 - 15:18 #9
Det er linkeren der klager. Du mangler at linke pthread biblioteket på - dvs. du skal tilføje noget i retning af  "-lpthread" til options når du linker
Avatar billede jhald Nybegynder
06. marts 2003 - 00:20 #10
når jeg linker? *ser meget dum og uvidende ud*

link som parameter når jeg kompiler (hvordan?) eller noget mere der skal med i koden foruden det include?
Avatar billede segmose Nybegynder
06. marts 2003 - 08:46 #11
Nu kan jeg ikke huske den nøjagtige syntax for gcc men der er noget lignende:

gcc -lpthread hello.c
Avatar billede jhald Nybegynder
06. marts 2003 - 11:16 #12
fra man gcc fandt jeg det her:
Linker Options
-llibrary

så det lyder rigtigt nok med -lpthread

men:
hald@freebsd ~/c/threads #gcc -lpthread hello.c
/usr/libexec/elf/ld: cannot find -lpthread

og så bare for at prøve med mellemrum
hald@freebsd ~/c/threads #gcc -l pthread hello.c
/usr/libexec/elf/ld: cannot find -lpthread
Avatar billede segmose Nybegynder
06. marts 2003 - 11:38 #13
prøv

gcc hello.c -lpthread
Avatar billede noden Nybegynder
23. januar 2004 - 00:18 #14
Brug evt. bare select()
Den kan godt både lytte om der sker noget på din socket og dit tastatur.
Den kan se begge som streams.
Du kan også sætte en option på din socket som gør den til nonblocking.
Så når du læser fra din socket vil den fortælle at der ikke er noget/nok at læse.
Man kan fortælle den at der mindst skal være en bestemt mængde data for at den skal returnere at der er noget at læse.
Nonblocking option: O_NONBLOCK og skal vist bruges med option F_SETFL
Datamængde: (Søg efter lowwater mark) SO_RCVLOWAT og SO_SNDLOWAT og bruges sammen med select()
Avatar billede noden Nybegynder
23. januar 2004 - 00:28 #15
Jeg bruger g++ 3.3.? på Debian GNU (Linux)
Sæt den til nonblocking med fcntl:
// fd er din socket descriptor
int flags;
/* Sæt nonblocking */
if ((flags = fcntl(fd, F_GETFL, 0)) < 0) err_sys("F_GETFL fejl"); //fejl
flags |= O_NONBLOCK; // sæt option
if (fcntl(fd, F_SETFL, flags) < 0) err_sys("F_SETFL fejl");
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester