תקשורת באינטרנט Tutorial 8. 2 n Socket programming u What is socket ? u Sockets architecture u Types of Sockets u The Socket system calls u Data Transfer

  • Published on
    20-Dec-2015

  • View
    214

  • Download
    2

Embed Size (px)

Transcript

<ul><li> Slide 1 </li> <li> Tutorial 8 </li> <li> Slide 2 </li> <li> 2 n Socket programming u What is socket ? u Sockets architecture u Types of Sockets u The Socket system calls u Data Transfer u Service functions for sockets programming u Examples for Client - Server communication F STREAM Communication (TCP) F DATAGRAM Communication (UDP) u Port reservation u Example Contents </li> <li> Slide 3 </li> <li> 3 What is Sockets ? n First appeared in 4.1 BSD UNIX 1982. n Sockets: u is an abstraction used as communication endpoints. u is implemented as file descriptor with some state information stored in the socket library. </li> <li> Slide 4 </li> <li> 4 The Client Server model request reply </li> <li> Slide 5 </li> <li> 5 Example: UDP Echo n The simplest form of client-server interaction uses unreliable datagram delivery to convey messages from client to server and back. clientserver Waits for a datagram to arrive the echo port Reserve the source and destination addresses (IP addresses and ports) Return the datagram to its original sender Request sent to a well-known port The program become 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 </li> <li> Slide 6 </li> <li> 6 Example: UDP Echo (Cont.) n The example illustrates two important points that are generally true about client-server interaction: u The difference between the lifetime of servers and clients. u The use of reserved and non-reserved port identifiers. </li> <li> Slide 7 </li> <li> 7 Sockets architecture Kernel User Application TCP/UDP layer IP (network) layer Socket API MAC layer </li> <li> Slide 8 </li> <li> 8 Type of Sockets n Socket has an associated type that determine the semantic of the communication : u SOCK_STREAM: connection oriented byte stream - TCP. u SOCK_DGRAM: unreliable, connectionless communication - UDP u and more </li> <li> Slide 9 </li> <li> 9 Protocol family for sockets functions n The family specifies the address family: group of protocols with the same address format n Example of address family constants: u AF_INET - IPv4 protocols u AF_INET6 - IPv6 protocols u AF_LOCAL (AF_UNIX) - Unix domain protocols </li> <li> Slide 10 </li> <li> 10 Data Structures struct 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 */ }; </li> <li> Slide 11 </li> <li> 11 The Socket system calls n The Socket system calls: n int socket (int family, int type, int protocol) allocate a socket return: a socket descriptor or -1 family: communication domain type: type of socket- SOCK_STREAM, SOCK_DGRAM, SOCK_RAW protocol: particular protocol to use - 0 n int bind (int sd, struct sockaddr *addr, size_t addrlen) Bind a name to a socket return: 0 on success or -1 sd: socket descriptor (from the socket() system call) addr: pointer to the socket address addrlen: socket address length n int 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 -1 sd: socket descriptor (from the socket() system call) addr: pointer to the socket address addrlen: socket address length </li> <li> Slide 12 </li> <li> 12 The Socket system calls (cont) n int listen (int sd, int backlog) a queue for incoming connections is activated using listen() return: 0 on success or -1 sd: socket descriptor (from the socket() system call) backlog : Maximum queue length of processes waiting for connection. n int accept (int sd, struct sockaddr *addr, size_t *addrlen); Wait for a connection request (done by the server) return: new socket descriptor or -1 in case of failure sd: socket descriptor (from the socket() system call) addr: pointer to the socket address addrlen: socket address length. n int close (int sd) Close the socket or the connection with the remote host. sd: socket descriptor (from the socket() system call) </li> <li> Slide 13 </li> <li> 13 Data Transfer - send u int send (int sd, char *buf, int buf_len) transmit a message to another socket. send() can be used only when the socket is in a connected state. return: the number of bytes that has been delivered or -1. sd: socket descriptor (from the socket() system call) buf: the message you send. buf_len: the data length of buf u int sendto (int sd, char *buf, int buf_len, const struct sockaddr *to_addr, size_t to_len) used to transmitting data to remote host return: the number of bytes that has been delivered or -1. sd: socket descriptor (from the socket() system call) buf: a pointer to the data location buf_len: the data length to_addr: the socket address of the destination. to_len: the to_addr structure length. </li> <li> Slide 14 </li> <li> 14 Data Transfer - receive u recv (int sd, char *buf, int bub_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 -1. sd: socket descriptor (from the socket() system call) buf: the buffer address (in memory) for holding the received data. buf_len: the buffer length u 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 -1. sd: socket descriptor (from the socket() system call) buf: the buffer address (in memory) for holding the received data. buf_len: the buffer length from_addr: the socket address of the transmitter from_len: the from_addr structure length </li> <li> Slide 15 </li> <li> 15 Service functions for sockets programming n Byte ordering u short htons(short) - convert 16-bit value from host to network u long htonl(long) - convert 32-bit value from host to network u short ntohs(short) - convert 16-bit value from network to host u long ntohl(long) - convert 32-bit value from network to host n Deal with IP address u ina.sin_addr.s_addr = inet_addr("132.68.1.8") u returns the address in Network Byte Order already. n DNS u int gethostname(char* name, int namelen) return local host name u struct hostent *gethostbyname(char* name) use to get computer address by the name. u struct hostent *gethostbyaddr(char *addrp, int len, int type) </li> <li> Slide 16 </li> <li> 16 From Beej's Guide to Network Programming n socket()--Get the File Descriptor! n bind()--What port am I on? n connect()--Hey, you! n listen()--Will somebody please call me? n accept()--"Thank you for calling port 3490." n send() and recv()--Talk to me, baby! n sendto() and recvfrom()--Talk to me, DGRAM-style n close() and shutdown()--Get outta my face! </li> <li> Slide 17 </li> <li> 17 Stream Sockets TCP ClientTCP Server sd = 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,...) </li> <li> Slide 18 </li> <li> 18 Datagram Sockets UDP Client UDP Server sd = socket() sendto(sd,) recvfrom(sd,) close(sd) sd = socket() bind(sd,port) recvfrom(sd,) sendto(sd,) </li> <li> Slide 19 </li> <li> 19 Port reservation n Ports 0 through 1023 are reserved. n Other ports are used by system for assignment to clients. </li> <li> Slide 20 </li> <li> 20 Example (UDP Client) // This program sends UDP packets to the given address #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 &lt; 2) error("\nYou should supply parameter: the number of messages to send"); </li> <li> Slide 21 </li> <li> 21 Example (UDP Client) // Opening socket if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) &lt; 0) error("Could not open socket"); // Sending a message to the server bzero((char*) &amp;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</li></ul>