q TCP 1 IT COOKBOOK TCP TCP TCP
q TCP 서버 함수 - (1) • IT COOKBOOK TCP 서버 함수 TCP 서버 TCP 클라이언트 socket() bind() listen() accept() recv() 한빛미디어㈜ connect() 네트워크 send() recv() closesocket() -7 - ehanbit. net
q TCP 서버 함수 - (2) • IT COOKBOOK bind() 함수 – 서버의 지역 IP 주소와 지역 포트 번호를 결정 int bind ( SOCKET s, const struct sockaddr* name, int namelen ); // 소켓생성 결과값 // 소켓구조체(주소, 포트번호, 프로토콜타입) // 소켓구조체 크기 성공: 0, 실패: SOCKET_ERROR • bind() 함수 사용 예 (예제 1 참조) 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()"); -8 - ehanbit. net
q TCP 서버 함수 - (3) • IT COOKBOOK listen() 함수 – 소켓과 결합된 TCP 포트 상태를 LISTENING으로 변경 int listen ( SOCKET s, int backlog ); // 소켓생성 결과값 // 연결큐의 길이 (최대 접속자수) 성공: 0, 실패: SOCKET_ERROR • listen() 함수 사용 예 059 060 한빛미디어㈜ retval = listen (listen_sock, SOMAXCONN); if(retval == SOCKET_ERROR) err_quit("listen()"); -9 - ehanbit. net
q TCP 서버 함수 - (4) • IT COOKBOOK accept() 함수 – 접속한 클라이언트와 통신할 수 있도록 새로운 소켓을 생성하여 리턴 – 접속한 클라이언트의 IP 주소와 포트 번호를 알려줌 SOCKET accept ( SOCKET s, struct sockaddr* addr, int* addrlen ); • 성공: 새로운 소켓, 실패: INVALID_SOCKET accept() 함수 사용 예 062 063 064 065. . . 068 069 070 071 072 073 074 075 한빛미디어㈜ // 소켓(클라이언트전용) 생성 결과값 // 클라이언트의 IP주소와 포트번호 지정된 메모리에 저장 // 지정된 메모리 주소값 // 데이터 통신에 사용할 변수 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; } - 10 - ehanbit. net
q TCP 서버 함수 - (5) • IT COOKBOOK accept() 함수 사용 예 (계속) 076 077 078 079 080. . . 101 102 103 104 105 106 107 한빛미디어㈜ printf("n[TCP 서버] 클라이언트 접속: IP 주소=%s, 포트 번호=%dn", inet_ntoa(clientaddr. sin_addr), ntohs(clientaddr. sin_port)); // 클라이언트와 데이터 통신 while(1){ } // closesocket() closesocket(client_sock); printf("[TCP 서버] 클라이언트 종료: IP 주소=%s, 포트 번호=%dn", inet_ntoa(clientaddr. sin_addr), ntohs(clientaddr. sin_port)); } - 11 - ehanbit. net
q TCP 클라이언트 함수 - (1) • IT COOKBOOK TCP 클라이언트 함수 TCP 서버 TCP 클라이언트 socket() bind() listen() accept() recv() 한빛미디어㈜ connect() 네트워크 send() recv() closesocket() - 13 - ehanbit. net
q TCP 클라이언트 함수 - (2) • IT COOKBOOK connect() 함수 – 서버에게 접속하여 TCP 프로토콜 수준의 연결 설정 int connect ( SOCKET s, const struct sockaddr* name, int namelen ); • // 서버와 통신을 하기 위해 만든 소켓 // 서버 주소, 포트번호 -> 특정 주소값에 저장 // 소켓 주소 구조체 변수의 크기 성공: 0, 실패: SOCKET_ERROR connect() 함수 사용 예 070 SOCKADDR_IN serveraddr; 071 serveraddr. sin_family = AF_INET; 072 serveraddr. sin_port = htons(9000); 073 serveraddr. sin_addr. s_addr = inet_addr("127. 0. 0. 1"); 074 retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); 075 한빛미디어㈜ if(retval == SOCKET_ERROR) err_quit("connect()"); - 14 - ehanbit. net
q 데이터 전송 함수 - (3) • IT COOKBOOK recvn() 함수 : 만약 수신할 전체 크기를 알고 있다면 037 int recvn (SOCKET s, char *buf, int len, int flags) 038 { 039 int received; 040 char *ptr = buf; 041 int left = len; // left : 보낼 총 바이트 수 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 } 한빛미디어㈜ - 17 - ehanbit. net
q 데이터 전송 함수 - (5) • IT COOKBOOK 데이터 전송 함수 사용 예 – TCP 클라이언트 078 079. . . 082 083 084 085 086 087 088 089 090 091 092 093 094 한빛미디어㈜ char buf[BUFSIZE+1]; int len; while(1){ // 데이터 입력 Zero. Memory(buf, sizeof(buf)); printf("n[보낼 데이터] "); if(fgets(buf, BUFSIZE+1, stdin) == NULL) // 사용자로부터 문자열 입력 break; // 'n' 문자 제거 len = strlen(buf); if(buf[len-1] == 'n') buf[len-1] = '