TCP 18 v TCP TCP TCP socket bind
TCP 서버 함수 (1/8) v TCP 서버 함수 TCP 서버 TCP 클라이언트 socket() bind() listen() accept() recv() connect() 네트워크 send() recv() closesocket()
TCP 서버 함수 (2/8) v bind() 함수 u 서버의 지역 IP 주소와 지역 포트 번호를 결정 int bind ( SOCKET s, const struct sockaddr* name, int namelen ); 성공: 0, 실패: SOCKET_ERROR
TCP 서버 함수 (3/8) v bind() 함수 사용 예 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()");
TCP 서버 함수 (4/8) v listen() 함수 u 소켓과 결합된 TCP 포트 상태를 LISTENING으로 변경 int listen ( SOCKET s, int backlog ); 성공: 0, 실패: SOCKET_ERROR
TCP 서버 함수 (5/8) v listen() 함수 사용 예 059 060 retval = listen(listen_sock, SOMAXCONN); if(retval == SOCKET_ERROR) err_quit("listen()");
TCP 서버 함수 (7/8) v accept() 함수 사용 예 062 063 064 065. . . 068 069 070 071 072 073 074 075 // 데이터 통신에 사용할 변수 SOCKET client_sock; SOCKADDR_IN clientaddr; int addrlen; while(1){ // accept() addrlen = sizeof(clientaddr); client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrle if(client_sock == INVALID_SOCKET){ err_display("accept()"); continue; }
TCP 서버 함수 (8/8) v accept() 함수 사용 예 (cont’d) 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)); }
TCP 클라이언트 함수 (1/3) v TCP 클라이언트 함수 TCP 서버 TCP 클라이언트 socket() bind() listen() accept() recv() connect() 네트워크 send() recv() closesocket()
TCP 클라이언트 함수 (2/3) v connect() 함수 u 서버에게 접속하여 TCP 프로토콜 수준의 연결 설정 int connect ( SOCKET s, const struct sockaddr* name, int namelen ); 성공: 0, 실패: SOCKET_ERROR
TCP 클라이언트 함수 (3/3) v connect() 함수 사용 예 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()");
데이터 전송 함수 (4/10) v recvn() 함수 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 }
데이터 전송 함수 (6/10) v 데이터 전송 함수 사용 예 – 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] = '