* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download What is Sockets
Survey
Document related concepts
Recursive InterNetwork Architecture (RINA) wikipedia , lookup
Internet protocol suite wikipedia , lookup
Parallel port wikipedia , lookup
Dynamic Host Configuration Protocol wikipedia , lookup
Cracking of wireless networks wikipedia , lookup
Zero-configuration networking wikipedia , lookup
Transcript
תקשורת באינטרנט Tutorial 8 socket Contents Socket programming What is 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) DATAGRAM Communication (UDP) Port reservation Example 2 What is Sockets ? 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. 3 The Client Server model request port 2353 telnet port 24 reply client 2 ip = 132.68.44.79 port 20 ftp port 3328 s e rve r ip = 132.68.8.1 client 1 ip = 132.68.44.73 4 Example: UDP Echo The simplest form of client-server interaction uses unreliable datagram delivery to convey messages from client to server and back. Request sent to a well-known port client server Response sent to the client’s 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 • 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 5 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. 6 Sockets architecture Application User Socket API Kernel TCP/UDP layer IP (network) layer MAC layer 7 Type of Sockets Socket has an associated type that determine the semantic of the communication : SOCK_STREAM: connection oriented byte stream - TCP. SOCK_DGRAM: unreliable, connectionless communication UDP and more 8 Protocol family for sockets functions The family specifies the address family: group of protocols with the same address format Example of address family constants: AF_INET - IPv4 protocols AF_INET6 - IPv6 protocols AF_LOCAL (AF_UNIX) - Unix domain protocols 9 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 */ }; 10 The Socket system calls The Socket system calls: 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 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 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 11 The Socket system calls (cont) 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. 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. int close(int sd) Close the socket or the connection with the remote host. sd: socket descriptor (from the socket() system call) 12 Data Transfer - send 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 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. 13 Data Transfer - receive 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 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 14 Service functions for sockets programming Byte ordering Deal with IP address short htons(short) - convert 16-bit value from host to network long htonl(long) - convert 32-bit value from host to network short ntohs(short) - convert 16-bit value from network to host long ntohl(long) - convert 32-bit value from network to host ina.sin_addr.s_addr = inet_addr("132.68.1.8") returns the address in Network Byte Order already. DNS int gethostname(char* name, int namelen) return local host name struct hostent *gethostbyname(char* name) use to get computer address by the name. struct hostent *gethostbyaddr(char *addrp, int len, int type) 15 From Beej's Guide to Network Programming socket()--Get the File Descriptor! bind()--What port am I on? connect()--Hey, you! listen()--Will somebody please call me? accept()--"Thank you for calling port 3490." send() and recv()--Talk to me, baby! sendto() and recvfrom()--Talk to me, DGRAM-style close() and shutdown()--Get outta my face! 16 Stream Sockets TCP Client TCP Server sd = socket(…) sd = socket(…) bind(sd,port) bind(sd,port) listen(sd) new_sd = accept(sd) connect(sd,dest) send(sd,…) recv(new_sd,…) recv(sd,…) send(new_sd,…) close(sd) close(new_sd,...) 17 Datagram Sockets UDP Client sd = socket(…) UDP Server sd = socket(…) bind(sd,port) recvfrom(sd,…) sendto(sd,…) recvfrom(sd,…) close(sd) sendto(sd,…) 18 Port reservation Ports 0 through 1023 are reserved. Other ports are used by system for assignment to clients. 19 Example (UDP Client) // This program sends UDP packets to the given address #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #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"); 20 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<mesNum; i++) { strcpy(message, "Test message: "); sprintf(message2, "%d", i+mesNum); strcat(message, message2); res = sendto(sockfd, message, strlen(message)+1, 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); printf("\nClient sent %d bytes", res); } } 21 Example (UDP Server) // This program receives UDP packets #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #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); 22 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); } } 23