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 socket\n”); 16 if ( (sockid = socket (AF_INET, SOCK_DGRAM, 0)) < 0) 17 { printf(“Server: socket error: %d\n”,errno); exit(0); } 18 printf(“Server: binding my local socket\n”); 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: %d\n”,errno); exit(0); } 26 printf(“Server: starting blocking message read\n”); 27 nread = recvfrom(sockid,msg,11,0, 28 (struct sockaddr *) &client_addr, &addrlen); 29 printf(“Server: retrun code from read is %d\n”,nread); 30 if (nread >0) printf(“Server: message is: %.11s\n”,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 socket\n”); 18 if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 19 { printf(“Client: socket failed: %d\n”,errno); exit(0);} 20 21 printf(“Client: binding my local socket\n”); 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: %d\n”,errno); exit(0); } 29 30 printf(“Client: creating addr structure for server\n”); 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 sending\n”); 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: %d\n”,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