Documente Academic
Documente Profesional
Documente Cultură
© Ion BICA 2
Caracteristicile socket-urilor
Domeniu
– AF_UNIX: formatul de adresa conţine un nume de fişier
– AF_INET: formatul de adresa conţine o adresa IP şi număr de port
Tip
– circuit virtual
– datagrama
Protocol
– TCP (circuit virtual)
– UDP (datagrama)
Mod de comunicare
– Client–Server
• serverul aşteaptă cereri de la clienţi
– Peer–to–Peer
• procesele sunt simetrice
© Ion BICA 3
Socket API
socket(): creează un socket de un anumit tip
bind(): realizează legătura între un socket şi o adresă de conectare
listen(): specifică numărul de cereri de conexiune care pot fi ţinute
în aşteptare la nivelul serverului
accept(): folosit de server pentru a accepta o cerere de conexiune
de la un client
connect(): folosit de client pentru a solicita stabilirea legăturii cu un
server
send(), sendto(): transmitere date
recv(), recvfrom(): recepţionare date
shutdown(): închidere conexiune
close(): dealocare resurse
© Ion BICA 4
Socket-uri TCP
© Ion BICA 5
socket()
#include <sys/types.h>
#include <sys/socket.h>
domain:
– AF_UNIX: comunicaţie între procese de pe acelaşi sistem
– AF_INET: comunicaţie între procese din reţea
type:
– SOCK_STREAM: orientat conexiune (circuit virtual)
– SOCK_DGRAM: neorientat conexiune (datagram)
– SOCK_SEQPACKET: orientat conexiune folosind mesaje de dimensiune
maximă (de regulă, aceasta obţine nu este suportată)
protocol:
– de obicei este zero; protocolul este stabilit prin intermediul tipului
returnează un descriptor de socket (socket ID) sau -1 în caz de eroare
© Ion BICA 6
bind()
#include <sys/types.h>
#include <sys/socket.h>
© Ion BICA 7
sockaddr
Socket-uri INTERNET
struct sockaddr_in {
sa_family_t sin_family; // = AF_INET
in_port_t sin_port; // numărul portului
struct in_addr sin_addr; // adresa IP
}
Socket-uri UNIX
struct sockaddr_un {
uint8_t sun_length; //
short sun_family; // = AF_UNIX
char sun_path [126];// numele fişierului
}
© Ion BICA 8
listen()
#include <sys/types.h>
#include <sys/socket.h>
© Ion BICA 9
accept()
#include <sys/types.h>
#include <sys/socket.h>
© Ion BICA 10
connect()
#include <sys/types.h>
#include <sys/socket.h>
© Ion BICA 11
send()
#include <sys/types.h>
#include <sys/socket.h>
int send (int sid, const char *bufferPtr, int len, int flag);
© Ion BICA 12
recv()
#include <sys/types.h>
#include <sys/socket.h>
int recv (int sid, char *bufferPtr, int len, int flag);
© Ion BICA 13
shutdown()
#include <sys/types.h>
#include <sys/socket.h>
© Ion BICA 14
Alte apeluri sistem
gethostname()
– returnează numele calculatorului
gethostbyname(), gethostbyaddr()
– conversia nume in adresa IP şi invers
– resolver DNS
htons(), htonl(), ntohs(), ntohl()
– conversie între diferite formate de reprezentare
– network = big endian
– host: SPARC = big endian, Intel = little endian
inet_ntop(), inet_pton()
– conversie adrese IP în format printabil şi invers
© Ion BICA 15
Exemplu: TCP Server (versiunea iterativa)
int listenSocket, connectSocket;
struct sockaddr_in serverAddr, clientAddr;
while(1) {
int clientAddrLength = sizeof(clientAddr);
connectSocket = accept (listenSocket, (struct sockaddr *) &clientAddr,
&clientAddrLength);
close (connectSocket);
}
close (listenSocket);
© Ion BICA 16
Exemplu: TCP Server (versiunea concurenta)
int listenSocket, connectSocket;
struct sockaddr_in serverAddr, clientAddr;
while(1) {
int clientAddrLength = sizeof(clientAddr);
connectSocket = accept (listenSocket, (struct sockaddr *) &clientAddr,
&clientAddrLength);
if (!fork()) { // this is the child process
close (listenSocket); // child doesn't need the listener
close (connectSocket);
exit(0);
}
© Ion BICA 17
Exemplu: TCP Client
int socketDescriptor;
struct sockaddr_in serverAddr;
close (socketDescriptor);
© Ion BICA 18
Socket-uri UDP
© Ion BICA 19
sendto()
#include <sys/types.h>
#include <sys/socket.h>
© Ion BICA 21
Exemplu: UDP Server
int socketId;
struct sockaddr_in serverAddr, clientAddr;
close (socketId);
© Ion BICA 22
Exemplu: UDP Client
int socketId;
struct sockaddr_in serverAddr;
close (socketId);
© Ion BICA 23
© Ion BICA 24