Socket

Desemnarea de socket unei adrese de reţea: bind()

Fiecare socket trebuie să fie asociat cu un număr de port pe 16 bit pentru gazdă unică.

Trebuie să se asocieze socketul cu o adresă de reţea unică globală (adresă de gazdă şi port)

  • SO ştie că mesajele care vin adresate acestei adrese de gazdă şi port trebuiesc livrate (demultiplexate către) acest socket
  • o adresa de retur pentru toate mesajele care pleacă.
Numere port Comentariu
1 – 255 rezervat pentru servicii standard
21 serviciu ftp
23 serviciu telnet
25 SMTP email
80 demon http
1 – 1023 accesibile numai utilizatorilor privilegiaţi
1024 – 4999 utilizabile de către sistem şi procesele utilizatorului
5000 – utilizabile numai de către procesele utilizatorului

Adresarea socketului: structuri de adrese predefinite

Specificarea adreselor socketului: anumite structuri de date predefinite pentru dvs.:

struct sockaddr_in { /* INET socket addr info */ 
short sin_family; /* set me to AF_INET */ 
 u_short sin_port; /* 16 bit number, nbo */ 
 struct in_addr sin_addr; /* 32 bit host address */ 
  char sin_zero[8]; /* not used */
 }; 
struct in_addr { 
u_long s_addr; /* 32 bit host addr.,nbo */
};

Apelarea sistemului: bind()

  • int bind ( int sockfd, struct sockaddr *myaddr, int addresslen)
    • sockfd dacă variabila desemnată socket() răspunde cu o valoare
    • *myaddr: structura adresei sockaddr_in care păstrează informaţii despre  adresa locală. Trebuie să ai alocat dreptul pentru a face apelul sockaddr.
    • addresslen este dimensiunea structurii de adresă.

retur eroare indică număr de port deja în uz, ieşirea din interval
#include <sys/types.h>
#include <sys/socket.h>
#include „inet.h”
int sockfd;
struct sockaddr_in myaddr;
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{ /* handle error */ }
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(5100); /* > 5000 */
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* INADDR lets OS determine hostid */
if ( bind(sockfd, (struct sockaddr *)
&myaddr, sizeof(myaddr)) < 0)

{ /* handle error */ }

Exemplu: server fără conexiune

1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <errno.h>
7 #define MY_PORT_ID 6090 /* a number > 5000 */
8
9 main()
10 {
11 int sockid, nread, addrlen;
12 struct sockaddr_in my_addr, client_addr;
13 char msg[50];
14
15 printf(„Server: creating socketn”);
16 if ( (sockid = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
17 { printf(„Server: socket error: %dn”,errno); exit(0); }
18 printf(„Server: binding my local socketn”);
19 bzero((char *) &my_addr, sizeof(my_addr));
20 my_addr.sin_family = AF_INET;
21 my_addr.sin_addr.s_addr = htons(INADDR_ANY);
22 my_addr.sin_port = htons(MY_PORT_ID);
23 if ( (bind(sockid, (struct sockaddr *) &my_addr,
24 sizeof(my_addr)) < 0) )
25 { printf(„Server: bind fail: %dn”,errno); exit(0); }
26 printf(„Server: starting blocking message readn”);
27 nread = recvfrom(sockid,msg,11,0,
28 (struct sockaddr *) &client_addr, &addrlen);
29 printf(„Server: retrun code from read is %dn”,nread);
30 if (nread >0) printf(„Server: message is: %.11sn”,msg);
31 close(sockid);
32 }

Exemplu: client fără conexiune

1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <errno.h>
7 #define MY_PORT_ID 6089
8 #define SERVER_PORT_ID 6090
9 #define SERV_HOST_ADDR „128.119.40.186”
10
11 main()
12 {
13 int sockid, retcode;
14 struct sockaddr_in my_addr, server_addr;
15 char msg[12];
16
17 printf(„Client: creating socketn”);
18 if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
19 { printf(„Client: socket failed: %dn”,errno); exit(0);}
20
21 printf(„Client: binding my local socketn”);
22 bzero((char *) &my_addr, sizeof(my_addr));
23 my_addr.sin_family = AF_INET;
24 my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
25 my_addr.sin_port = htons(MY_PORT_ID);
26 if ( ( bind(sockid, (struct sockaddr *) &my_addr,
27 sizeof(my_addr)) < 0) )
28 { printf(„Client: bind fail: %dn”,errno); exit(0); }
29
30 printf(„Client: creating addr structure for servern”);
31 bzero((char *) &server_addr, sizeof(server_addr));
32 server_addr.sin_family = AF_INET;
33 server_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
34 server_addr.sin_port = htons(SERVER_PORT_ID);
35
36 printf(„Client: initializing message and sendingn”);
37 sprintf(msg, „Hello world”);
38 retcode = sendto(sockid,msg,12,0,(struct sockaddr *) &server_addr,
39 sizeof(server_addr));
40 if (retcode <= -1)
41 {printf(„client: sendto failed: %dn”,errno); exit(0);}
42
43 /* close socket */
44 close(sockid);
45 }

Exemplu: executarea comenzii trace

> cc udpserver.c; mv a.out udpserver 
> cc udpclient.c; mv a.out udpclient 
> udpserver &
  [1] 20837
> Server: creating socket
Server: binding my local socket
Server: starting blocking message read 
  > udpclient
Client: creating socket
Client: binding my local socket
Client: creating addr structure for server 
Client: initializing message and sending 
 Server: return code from read is 11
Server: message is: Hello world
[1] Done udpserver

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *