תקשורת באינטרנט

  • View
    36

  • Download
    0

Embed Size (px)

DESCRIPTION

. Sockets Programming. Tutorial 8. Contents. Socket programming What is a socket ? Sockets architecture Types of Sockets The Socket system calls Data Transfer Service functions for sockets programming Examples for Client - Server communication STREAM Communication (TCP) - PowerPoint PPT Presentation

Transcript

  • Tutorial 8

  • Socket programmingWhat is a socket ?Sockets architectureTypes of SocketsThe Socket system calls Data TransferService functions for sockets programmingExamples for Client - Server communicationSTREAM Communication (TCP)DATAGRAM Communication (UDP)Port reservationExampleContents

  • What is a Socket ?

    First appeared in 4.1 BSD UNIX 1982. Sockets:is an abstraction used as communication endpoints.is implemented as file descriptor with some state information stored in the socket library.

  • The Client Server model

    requestreply

  • Example:UDP Echo The simplest form of client-server interaction uses unreliable datagram delivery to convey messages from client to server and back.clientserver Reserves the source and destination addresses (IP addresses and ports) Waits for a datagram to arrive tothe echo port Returns the datagram to its original sender

    Request sent to a well-known port The program becomes a UDP echo client when it allocates an unused UDP protocol port Sends a UDP message to the UDP echo server Waits for the replay Response sent to the clients port

  • Example: UDP Echo (Cont.)The example illustrates two important points that are generally true about client-server interaction:The difference between the lifetime of servers and clients.The use of reserved and non-reserved port identifiers.

  • Sockets architecture

    KernelUserApplicationTCP/UDP layerIP (network) layerSocket APIMAC layer

  • Socket has an associated type that determine the semantic of the communication : SOCK_STREAM: connection oriented byte stream - TCPSOCK_DGRAM: unreliable, connectionless communication - UDPand more Type of Sockets

  • The family specifies the address family: group of protocols with the same address formatExample of address family constants:AF_INET - IPv4 protocolsAF_INET6 - IPv6 protocolsAF_LOCAL (AF_UNIX) - Unix domain protocols Protocol family for sockets functions

  • Data Structuresstruct sockaddr_in { short int sin_family; /* we use AF_INET */ unsigned short int sin_port; /* port number */ struct in_addr sin_addr; /* comp. address */ unsigned char sin_zero[8]; /* filled with 0s */};

    struct in_addr { u_long s_addr; /* unsigned long */};

  • The Socket system calls:int socket (int family, int type, int protocol) allocate a socketreturn: a socket descriptor or -1family: communication domaintype: type of socket- SOCK_STREAM, SOCK_DGRAM, SOCK_RAWprotocol: particular protocol to use - 0 int bind (int sd, struct sockaddr *addr, size_t addrlen)Bind a name to a socketreturn: 0 on success or -1sd: socket descriptor (from the socket() system call)addr: pointer to the socket addressaddrlen: socket address lengthint connect (int sd, const struct sockaddr *addr, size_t addrlen) Try to connect to a socket (done by the client)return: 0 on success or -1sd: socket descriptor (from the socket() system call)addr: pointer to the socket addressaddrlen: socket address length

    The Socket system calls

  • int listen (int sd, int backlog) a queue for incoming connections is activated using listen() return: 0 on success or -1sd: socket descriptor (from the socket() system call)backlog : Maximum queue length of processes waiting for connection int accept (int sd, struct sockaddr *addr, size_t *addrlen)Wait for a connection request (done by the server)return: new socket descriptor with the properties of sd or -1 in case of failuresd: socket descriptor (from the socket() system call)addr: pointer to the address of the connecting entityaddrlen: socket address length int close (int sd)Close the socket or the connection with the remote host.sd: socket descriptor (from the socket() system call) The Socket system calls (cont)

  • int send (int sd, char *buf, int buf_len)transmit a message to another socket. send() can beused only when the socket is in a connected state. return: the number of bytes that has been delivered or -1sd: socket descriptor (from the socket() system call)buf: the transmitted message buf_len: the data length of buf

    int sendto (int sd, char *buf, int buf_len, const struct sockaddr *to_addr, size_t to_len)used to transmit data to remote hostreturn: the number of bytes that has been delivered or -1sd: socket descriptor (from the socket() system call)buf: a pointer to the data locationbuf_len: the data lengthto_addr: the socket address of the destinationto_len: the to_addr structure length Data Transfer - send

  • int recv (int sd, char *buf, int buf_len)Obtain data from the socket. Used only when the socket is in a connected state. return: the number of bytes at the obtain input or -1sd: socket descriptor (from the socket() system call)buf: the address of buffer holding the received databuf_len: the buffer length

    int recvfrom (int sd, char *buf, int bub_len, struct sockaddr *from_addr, int from_len)Obtain data from the socket.return: the number of bytes at the obtain input or -1sd: socket descriptor (from the socket() system call)buf: the address of buffer holding the received databuf_len: the buffer lengthfrom_addr: the socket address of the transmitterfrom_len: the from_addr structure length

    Data Transfer - receive

  • Byte orderingshort htons(short) - convert 16-bit value from host to networklong htonl(long) - convert 32-bit value from host to networkshort ntohs(short) - convert 16-bit value from network to hostlong ntohl(long) - convert 32-bit value from network to hostDeal with IP address ina.sin_addr.s_addr = inet_addr("132.68.1.8")returns the address in Network Byte Order already.

    DNSint gethostname(char* name, int namelen)return local host namestruct hostent *gethostbyname(char* name) use to get computer address by the name.struct hostent *gethostbyaddr(char *addrp, int len, int type)

    Service functions for sockets programming

  • Stream SocketsTCP ClientTCP Serversd = socket()

    bind(sd,port)

    connect(sd,dest)

    send(sd,)

    recv(sd,)

    close(sd)sd = socket()

    bind(sd,port)

    listen(sd)

    new_sd = accept(sd)

    recv(new_sd,)

    send(new_sd,)

    close(new_sd,...)

  • Datagram SocketsUDP ClientUDP Serversd = socket()

    sendto(sd,)

    recvfrom(sd,)

    close(sd)sd = socket()

    bind(sd,port)

    recvfrom(sd,)

    sendto(sd,)

  • Ports 0 through 1023 are reserved.

    Other ports are used by system for assignment to clients.

    Port reservation

  • Example (UDP Client)// This program sends UDP packets to the given address #include #include #include #include #include

    #define SERVER_ADDR "127.0.0.1"#define SERVER_PORT 5555

    void error(char *str){ printf("\n%s", str); exit(0);}

    int main(int argc, char *argv[]){ char message[100], message2[10]; int sockfd, res; struct sockaddr_in client_addr, server_addr; int i, mesNum;

    printf("\nClient is running...");

    if (argc < 2) error("\nYou should supply parameter: the number of messages to send");

  • Example (UDP Client)

    // Opening socket if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) error("Could not open socket");

    // Sending a message to the server bzero((char*) &server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); server_addr.sin_port = htons(SERVER_PORT);

    mesNum = atoi(argv[1]); if (mesNum == 0) error("\nIllegal parameter");

    for (i=0; i

  • Example (UDP Server)

    // This program receives UDP packets#include #include #include #include #include

    #define SERVER_PORT 5555#define MAX_MESSAGE_SIZE 100

    void error(char *str){ printf("\n%s", str); exit(0);}

    int main(){ char message[MAX_MESSAGE_SIZE]; int sockfd, res; struct sockaddr_in client_addr, server_addr; int addr_len; printf("\nServer is running..."); fflush(stdout);

  • Example (UDP Server)// Opening socket if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) error("Could not open socket"); // Bind local ip and process addresses bzero((char*) &server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(SERVER_PORT);

    if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) error("Could not bind to the socket");

    while (1) { // Receiving a message from the client addr_len = sizeof(client_addr); res = recvfrom(sockfd, message, MAX_MESSAGE_SIZE, 0, (struct sockaddr*)&client_addr, &addr_len);

    printf("\nServer received %d bytes", res); printf("\n%s", message); fflush(stdout); }}