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