debielenhandleiding sockets programmeren in c (*nix)

Pagina: 1
Acties:

  • xzenor
  • Registratie: Maart 2001
  • Laatst online: 14-10-2022

xzenor

Ja doe maar. 1 klontje suiker.

Topicstarter
Hi,

Ik ben echt al weken aan het proberen te begrijpen hoe ik met sockets moet werken onder C ( onder unix, en geen c++ maar gewoon c).
En ik vind ladingen handleidingen met google, maar snappen doe ik het nog steeds niet..

Dus ik ben eigenlijk op zoek naar een echte debielen handleiding voor sockets programmeren..
zelfs Beej's handleiding voor sockets programmeren daar kom ik niet uit..
en dat is toch een behoorlijk uitgebreide....

Ik heb mezelf scheel gegoogled (ik google, wij googlen, zij hebben gegoogled.. hm ja, klopt wel) maar ik kom er niet uit..

Mijn C kennis is (zoals wel opgevallen was denk ik) niet optimaal nog, maar ik ben wel op weg... ook met zoeken heb ik wel vrij veel geleerd al.. maar iets werkends maken is me nog niet gelukt....

Ik wil best lezen..
maar ik weet niet meer waar......

[ Voor 5% gewijzigd door xzenor op 26-03-2003 10:04 ]


  • CT
  • Registratie: September 2001
  • Laatst online: 22:23

CT

📱💻 🎮 ⌚🖥

uhhhhhhhhhhh
in een noten dopje:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

main () {
  int create_socket;
  struct sockaddr_in address;   // dit is de voorgedefineerde struct van een socket

  create_socket = socket(AF_INET,SOCK_STREAM,0);   // vraag bij het OS een outgoing socket aan
  address.sin_family = AF_INET;   // set de adres familie van de socket struct 
  address.sin_port = htons(80);       // vul hier de poort in
  inet_pton(AF_INET, "192.168.0.1", &address.sin_addr);   // vul hier de server ze ip in

  // En probeer dan een connectie te maken via de aangevraagde socket van de OS   naar het IP en POORT van de server (dit alles verpakt in een struct sockaddr_in die de boel zo op een rijtje zet dat je een mooi tcp/ip pakketje heb)
  if (connect(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0) {
     // Jippie connectie
  } else {
    // helaas niks geen connectie!
  }

}


Voor de info over htons bijvoorbeeld moet je maar in die 'how to socket program' PDF'jes zoeken. Het zijn namelijk manieren om bijvoorbeeld Ascii naar netwerk taal te transformeren (er zijn verschillende transformatie's mogelijk). En voor AF_INET (Address Familie Internet) kan je ook heel wat vinden, dit heeft met OSI modellen te maken geloof ik. Maar dit is ongeveer de implementatie.

  • xzenor
  • Registratie: Maart 2001
  • Laatst online: 14-10-2022

xzenor

Ja doe maar. 1 klontje suiker.

Topicstarter
hij doet het niet...
compilen geeft een lading fouten...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ cc test.c
In file included from test.c:1:
/usr/include/sys/socket.h:52: syntax error before `sa_family_t'
/usr/include/sys/socket.h:52: warning: data definition has no type or storage class
/usr/include/sys/socket.h:163: syntax error before `u_char'
/usr/include/sys/socket.h:174: syntax error before `u_short'
/usr/include/sys/socket.h:188: syntax error before `u_char'
/usr/include/sys/socket.h:190: `int64_t' undeclared here (not in a function)
/usr/include/sys/socket.h:190: `u_char' undeclared here (not in a function)
/usr/include/sys/socket.h:190: size of array `__ss_pad1' is too large
/usr/include/sys/socket.h:191: syntax error before `int64_t'
/usr/include/sys/socket.h:192: `u_char' undeclared here (not in a function)
/usr/include/sys/socket.h:192: `int64_t' undeclared here (not in a function)
/usr/include/sys/socket.h:192: `u_char' undeclared here (not in a function)
/usr/include/sys/socket.h:192: `int64_t' undeclared here (not in a function)
/usr/include/sys/socket.h:359: syntax error before `pid_t'
/usr/include/sys/socket.h:364: syntax error before `gid_t'
/usr/include/sys/socket.h:399: syntax error before `u_short'
/usr/include/sys/socket.h:407: syntax error before `caddr_t'
/usr/include/sys/socket.h:411: syntax error before `caddr_t'
In file included from test.c:1:
/usr/include/sys/socket.h:444: syntax error before `recv'
/usr/include/sys/socket.h:444: syntax error before `size_t'
/usr/include/sys/socket.h:444: warning: data definition has no type or storage class
/usr/include/sys/socket.h:445: syntax error before `recvfrom'
/usr/include/sys/socket.h:445: syntax error before `size_t'
/usr/include/sys/socket.h:445: warning: data definition has no type or storage class
/usr/include/sys/socket.h:446: syntax error before `recvmsg'
/usr/include/sys/socket.h:446: warning: data definition has no type or storage class
/usr/include/sys/socket.h:447: syntax error before `send'
/usr/include/sys/socket.h:447: syntax error before `size_t'
/usr/include/sys/socket.h:447: warning: data definition has no type or storage class
/usr/include/sys/socket.h:448: syntax error before `sendto'
/usr/include/sys/socket.h:449: syntax error before `size_t'
/usr/include/sys/socket.h:449: warning: data definition has no type or storage class
/usr/include/sys/socket.h:450: syntax error before `sendmsg'
/usr/include/sys/socket.h:450: warning: data definition has no type or storage class
/usr/include/sys/socket.h:451: syntax error before `off_t'


en ik heb alleen de poort en het ip aangepast...
meer niet :(
Overigens is de bijgetypte uitleg wel goed, als ie nu nog zou werken ook :'(
Misschien scheelt het dat ik FreeBSD gebruik en geen linux..

edit:
Blijkbaar was dat het dus...
als ik het hele verhaal op een linuxmachine inklop dan werkt het gewoon prima...
Maar op mijn FreeBSD machine geeft ie deze lijst foutmeldingen.

[ Voor 14% gewijzigd door xzenor op 26-03-2003 11:19 . Reden: fuk.... ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

probeer sys/socket.h eens als laatst te includen ipv als eerst

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

ehm, me too compleet noob, maar ik heb in de linux man pages af en toe voorbeelden van socket programmeren gezien ('k denk man ipv6 om mee te beginnen, da's de laatste die'k me herinner, dus zou'k daar ook eens in neuzen, misschien niet uitgebreid, maar toch wel wat...)

Verwijderd

Ik zou zeggen dat de beej's handleiding een van de gemakkelijkste is. Dus als het je daar niet mee lukt, dan zal het hier waarschijnlijk ook niet lukken.
Is er niet ergens een Nederlandstalig boek te vinden over Sockets in *nix en C?

[ Voor 79% gewijzigd door Verwijderd op 26-03-2003 23:47 ]


Verwijderd

Ik probeerde dit een tijdje geleden ook, en wat ik heel handig vond is de programmers manual te installeren. Dan kan je gewoon man printf of man connect typen en je krijgt de manual page van die functie.

Ik heb zelf dit gefabriceerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

#define SERVER_NAME "localhost"
#define SERVER_PORT 80


char * readableaddr(char * h_addr) ;

int main() {
    int sd, rc;  // sd = socket descriptor
    struct hostent * h; // zoek deze eens op in een van de *.h bestanden of de MSDN developers library
    struct sockaddr_in serv_addr, local_addr;
    printf("TCP client v 0.01\n");

    printf("Resolving host: %s\n", SERVER_NAME);
    h=gethostbyname(SERVER_NAME);
    if (h==NULL) {
        printf("Unknown host: %s\n", SERVER_NAME);
        exit(1);
    } 
    printf("%s is %d.%d.%d.%d\n", SERVER_NAME, 
            h->h_addr_list[0][0],
            h->h_addr_list[0][1],
            h->h_addr_list[0][2],
            h->h_addr_list[0][3]);
    printf("Using sin_family: %d\n", h->h_addrtype);
    serv_addr.sin_family=h->h_addrtype;

    memcpy((char *) &serv_addr.sin_addr.s_addr, 
            h->h_addr_list[0],
            h->h_length);

    serv_addr.sin_port=htons(SERVER_PORT); // host to networks byte order

    printf("Opening socket\n");
    sd=socket(AF_INET, SOCK_STREAM, 0);
    if (sd<0) {
        printf("Failed!");
        exit(2);
    }

    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    local_addr.sin_port=htons(0);

    printf("Binding socket\n");
    rc=bind(sd, (struct sockaddr *) & local_addr, sizeof(local_addr));
    if (rc<0) {
        printf("Failed!");
        exit(3);
    }

    printf("Connecting ");
    rc=connect(sd, (struct sockaddr *) & serv_addr, sizeof(serv_addr));
    if (rc<0) {
        printf("failed!\n");
        exit(4);
    }
    printf("succeeded!\n");

    char * msg="GET /\n";
    printf("Sending data ");
    rc=send(sd, msg, strlen(msg)+1,0);  
    if (rc<0) {
        printf("failed!\n");
        exit(5);
    }
    printf("succeeded!\n");
    printf("Recieving data:\n");
    char recvmsg[100];
    while (rc>0) {
        memset(recvmsg, 0x0, 100);
        rc=recv(sd, recvmsg, 99, 0);
        printf("%s", recvmsg);
    } 
    

    printf("\nClosing connection\n");
    close(rc);


}


Je kan het beste de volgorde aanhouden die in de tutorial staat (resolv, connect, etc. etc.) en vervolgens de bijbehorende functies en structures in de manual pages zoeken.

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

CT schreef op 26 March 2003 @ 10:34:

Voor de info over htons bijvoorbeeld moet je maar in die 'how to socket program' PDF'jes zoeken. Het zijn namelijk manieren om bijvoorbeeld Ascii naar netwerk taal te transformeren (er zijn verschillende transformatie's mogelijk). En voor AF_INET (Address Familie Internet) kan je ook heel wat vinden, dit heeft met OSI modellen te maken geloof ik. Maar dit is ongeveer de implementatie.
htons() en ntohs() zijn byte-order functies. Ze converteren een byte van host byte order naar network byte order. Network byte order is altijd big endian, maar host byte order kan verschillen. Op x86 is dit little-endian. Op mijn machine (PowerPC, big endian) doet die functie dus niets. Zie ook de man page voor htons.

Ascii transformeren naar netwerk-taal doe je met inet_aton(). dit maakt van een dotted-quad ip adres een ip adres dat je kunt gebruiken voor sockets. (inet_ntoa() om dit de andere kant op te doen) Uiteraard heeft ook deze functie een man page: inet_ntoa :)

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

http://www.linuxsocket.org/books/Sockets/programs/ bevat een hele zooi voorbeelden behorende bij een-of-ander boek; daar heb ik het meeste dat ik nu weet van geleerd.

De simpele stappen voor een TCP-client
creeer een socket
connect
send en/of receive

De simpele stappen voor een TCP-server
creeer een socket
bind de socket
listen
accept
send en/of receive

Voor UDP hoef je alleen maar een socket te creeeren en evt te binden. Daarna kun je direct zenden en ontvangen (wat is het leven toch heerlijk simpel :+ ).

Verder zijn er wel wat goede boeken te vinden. Ik heb de 'Linux Programming Bible' van John Goertzen. Daar staan wat voorbeelden met uitleg in. Kostte vorig jaar pak'm beet 50 Euro voor de nederlandse versie (titel is 'Linux programmeurs handboek' oid). Voorbeelden zijn ook te vinden op het internet ( http://www.complete.org/publications/lpb/ ) maar zijn niet zo duidelijk zonder de uitleg (denk ik).

PS Twee maanden geleden was ik ook een debiel op dit gebied.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Het is wel niet helemaal wat je zoekt, maar op mijn site staat een winsock tutorial (wordt nog steeds bijgewerkt, chapter voor chapter).

Het is dus eigenlijk voor windows maar aangezien winsock ook alle basis socket functies heeft die hetzelfde werken als onder *nix heb je er misschien toch wat aan.

In ieder geval staat er een korte introductie over netwerken, over sockets in het algemeen, een introductie van de basisfuncties (deze zijn hetzelfde onder unix, behalve dan de winsock startup/cleanup). Chapter 5 heb je niks aan denk ik, is heel winsock specifiek maar chapter 6 is een simpele blocking client die met wat aanpassingen ook onder *nix + C kan werken (is nu dus windows en C++). De client wordt stap voor stap uitgelegd dus daarmee moet het wel duidelijk worden denk ik.

www.madwizard.org


  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

possamai schreef op 26 maart 2003 @ 10:02:
Ik wil best lezen..
maar ik weet niet meer waar......
http://www.ecst.csuchico.edu/~beej/guide/net/

Leesze :)

[ Voor 3% gewijzigd door igmar op 27-03-2003 14:09 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

zelfs Beej's handleiding voor sockets programmeren daar kom ik niet uit..
lezen!

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • xzenor
  • Registratie: Maart 2001
  • Laatst online: 14-10-2022

xzenor

Ja doe maar. 1 klontje suiker.

Topicstarter
lol :)

die link van sterretje is best wel goed trouwens..
Ik heb het overigens een beetje voor mekaar..
'k moet het nog wel uitwerken, maar het werk in iedergeval wel.
'k zal'm ff neerplanten hier, mocht iemand anders het zelfde start-probleem hebben...

tis zo kort en simpel dat het wat makkelijker te begrijpen is voor een beginner.
( nog geen name-resolven enzo )

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

/* port to connect to */
#define POORT 80

/* ip-address to connect to */
#define IP_ADDRESS "192.168.2.2"

/* grootte van var 'buf' */
#define MAXDATASIZE 10000000


int main(int argc, char *argv[])
{
    char get[] = "GET\n"; /* command to send */
    char buf[MAXDATASIZE];
    int len, aant_bytes;

    int sockfd;
    struct sockaddr_in dest_addr;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    dest_addr.sin_family = AF_INET;    /* host byte order */
    dest_addr.sin_port = htons(POORT); /* short (16 bit), network byte order */
    dest_addr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    memset(&(dest_addr.sin_zero), '\0', 8);  /* fill something with zeros */

/* connecting */
    if (connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == -1) {
        perror("connect");
        exit(1);
    }

/* sending */
    len = strlen(get);
    if ((aant_bytes = send(sockfd, get, len, 0)) == -1) {
        perror("recv");
        exit(1);
    }

/* receiving */
    if ((aant_bytes = recv(sockfd, buf, MAXDATASIZE - 1, 0)) == -1) {
        perror("recv");
        exit(1);
    }

    buf[aant_bytes] = '\0';

    printf("Send:\n%s\n",get);
    printf("\nReceived:\n%s\n",buf);

    close(sockfd);

    return 0;
}

[ Voor 21% gewijzigd door xzenor op 30-03-2003 23:33 ]

Pagina: 1