Chapter 04 TCP ServerClient q Goal IT COOKBOOK
Chapter 04. TCP Server/Client
q Goal IT COOKBOOK • Basic structure and principle of TCP server/client • Socket system call for TCP application • Understanding application protocol -1 -
q TCP server/client operation (1/6) IT COOKBOOK • TCP server/client example GET / HTTP/1. 1 Accept: image/gif, . . . Web server <HTML> <HEAD>. . . </HEAD>. . . Web client -2 -
q TCP server/client operation (2/6) IT COOKBOOK • TCP server/client operation TCP server TCP client listen accept recv connect network send recv -3 -
q TCP server/client operation (3/6) IT COOKBOOK • TCP server/client socket calls (cont’d) - bind : to assign a name to an unnamed socket. - listen: to indicate that it is willing to receive connections. - connect: to establish a connection with a server - send: to send data to peer side - accept: to accept the connection request from client - recv: to receive the data that client sent -4 -
q TCP server/client operation(4/6) IT COOKBOOK • TCP server/client operation principle TCP server waiting Client connecting TCP clients #1 -5 -
q TCP server/client operation(5/6) IT COOKBOOK • TCP server/client operation principle (cont’d) TCP server waiting Comm. TCP client #1 -6 - Comm. TCP client #2
q TCP server/client operation(6/6) IT COOKBOOK • TCP server/client operation principle (cont’d) TCP server. . . waiting TCP client #1 . . . -7 - TCP client #n
q TCP server/client example IT COOKBOOK • Code Example(TCPServer. cpp, TCPClient. cpp) fgets() send() recv() TCP client printf() TCP server recv() send() -8 -
q TCP server/client analysis (1/2) • Socket requires three components ① protocol • Defined by Socket() system call ② local IP address and port number • Server or client side ③ remote IP address and port number -9 - IT COOKBOOK
q TCP server/client analysis (2/2) IT COOKBOOK • Socket data structure application OS network server client local IP addr. Local port num. Remote IP addr. Remote port num. • • • - 10 -
q Socket call for TCP server (1/8) IT COOKBOOK • TCP server side TCP server TCP client socket() bind() listen() accept() recv() connect() network send() recv() closesocket() - 11 -
q Socket call for TCP server (2/8) IT COOKBOOK • bind() – Assign a name to an unnamed socket – Define IP address and port number of server side int bind ( SOCKET s, const struct sockaddr* name, int namelen ); success: 0, fail: SOCKET_ERROR - 12 -
q Socket call for TCP server (3/8) IT COOKBOOK • bind() example 050 051 052 053 054 055 056 SOCKADDR_IN serveraddr; Zero. Memory(&serveraddr, sizeof(serveraddr)); serveraddr. sin_family = AF_INET; serveraddr. sin_port = htons(9000); serveraddr. sin_addr. s_addr = htonl(INADDR_ANY); retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); if(retval == SOCKET_ERROR) err_quit("bind()"); - 13 -
q Socket call for TCP server (4/8) IT COOKBOOK • listen() – transit TCP port state to LISTENING state - ready to receive connections. int listen ( SOCKET s, int backlog ); success: 0, fail: SOCKET_ERROR - 14 -
q Socket call for TCP server (5/8) • listen() example 059 060 retval = listen(listen_sock, SOMAXCONN); if(retval == SOCKET_ERROR) err_quit("listen()"); - 15 - IT COOKBOOK
q Socket call for TCP server (6/8) IT COOKBOOK • accept() – accept the connection request from client – tell the IP address and port number of client SOCKET accept ( SOCKET s, struct sockaddr* addr, int* addrlen ); success: new socket, fail: INVALID_SOCKET - 16 -
q Socket call for TCP server (7/8) IT COOKBOOK • accept() example 062 063 064 065. . . 068 069 070 071 072 073 074 075 // variables for data communiction SOCKET client_sock; SOCKADDR_IN clientaddr; int addrlen; while(1){ // accept() addrlen = sizeof(clientaddr); client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen); if(client_sock == INVALID_SOCKET){ err_display("accept()"); continue; } - 17 -
q Socket call for TCP server (8/8) IT COOKBOOK • accept() example (cont’d) 076 077 078 079 080. . . 101 102 103 104 105 106 107 printf("n[TCP server] client connection: IP addr=%s, port num=%dn", inet_ntoa(clientaddr. sin_addr), ntohs(clientaddr. sin_port)); // data comm with client while(1){ } // closesocket() closesocket(client_sock); printf("[TCP server] client exit: IP addr=%s, port num=%dn", inet_ntoa(clientaddr. sin_addr), ntohs(clientaddr. sin_port)); } - 18 -
q Socket call for TCP client (1/3) IT COOKBOOK • TCP client side TCP server TCP client socket() bind() listen() accept() recv() connect() network send() recv() closesocket() - 19 -
q Socket call for TCP client (2/3) IT COOKBOOK • connect() – to establish a connection with a server int connect ( SOCKET s, const struct sockaddr* name, int namelen ); success: 0, fail: SOCKET_ERROR - 20 -
q Socket call for TCP client (3/3) IT COOKBOOK • connect() example 070 071 072 073 074 075 SOCKADDR_IN serveraddr; serveraddr. sin_family = AF_INET; serveraddr. sin_port = htons(9000); serveraddr. sin_addr. s_addr = inet_addr("127. 0. 0. 1"); retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); if(retval == SOCKET_ERROR) err_quit("connect()"); - 21 -
q Data transfer socket call (1/10) IT COOKBOOK • Socket data structure application OS network server client Local IP addr Local port num Remote IP addr Remote port num Recv buffer Send buffer • • • - 22 -
q Data transfer socket call (2/10) IT COOKBOOK • send() 함수 – Data transfer to peer side int send ( SOCKET s, const char* buf, int len, int flags ); success: num of sent bytes, fail: SOCKET_ERROR - 23 -
q Data transfer socket call (3/10) IT COOKBOOK • recv() – Data receving from peer side int recv ( SOCKET s, char* buf, int len, int flags ); success: num of received bytes or 0(the remote side has closed the connection ), fail: SOCKET_ERROR - 24 -
q Data transfer socket call (4/10) IT COOKBOOK • recvn() function 037 int recvn(SOCKET s, char *buf, int len, int flags) 038 { 039 int received; 040 char *ptr = buf; 041 int left = len; 042 043 while(left > 0){ 044 received = recv(s, ptr, left, flags); 045 if(received == SOCKET_ERROR) 046 return SOCKET_ERROR; 047 else if(received == 0) 048 break; 049 left -= received; 050 ptr += received; 051 } 052 053 return (len - left); 054 } - 25 -
q Data transfer socket call (5/10) IT COOKBOOK • recvn() function principle buf len left ptr 읽은 데이터 - 26 -
q Data transfer socket call (6/10) IT COOKBOOK • Data send/recv example – TCP client 078 079. . . 082 083 084 085 086 087 088 089 090 091 092 093 094 char buf[BUFSIZE+1]; int len; while(1){ // data input Zero. Memory(buf, sizeof(buf)); printf("n[sending data] "); if(fgets(buf, BUFSIZE+1, stdin) == NULL) break; // 'n' char delete len = strlen(buf); if(buf[len-1] == 'n') buf[len-1] = '