---------------------------클라이언트---------------------------------------------------
//데이터 통신에 사용할 변수
char buf[BUFSIZE+1]; 1
int len; 2
while(1)
{
//데이터 입력
ZeroMemory(buf, sizeof(buf)); 3
printf("\n[보낼 데이터]"); 4
if(fgets(buf, BUFSIZE+1, stdin) == NULL) 5
break; 6
//\n 문자 제거
len = strlen(buf); 7
if(buf[len-1] =='\n') 8
buf[len-1] = '\0'; 9
if(strlen(buf) == 0) 10
break; 11
//데이터 보내기 12
retval = send(sock,buf,strlen(buf), 0);
if(retval == SOCKET_ERROR)
{
err_display("send()");
break;
}
printf("[TCP 클라이언트] %d 바이트를 보냈습니다! \n", retval);
//데이터 받기 13
retval = recvn(sock,buf,retval,0);
if(retval == SOCKET_ERROR)
{
err_display("recv()");
break;
}
else if(retval==0)
break;
//받은 데이터 출력
buf[retval] = '\0'; 14
printf("[TCP 클라이언트] %d 바이트를 받았습니당! \n" , retval);
printf("[받은 데이터] %s\n", buf);
}
-----------------------------------------------------------------------------------
---------------------------서버-----------------------------------------------------
//여기서 사용한 소켓( client_sock ) 은 accept() 함수의 리턴값으로 생성된 것임을 유의하도록 하자.
char buf[BUFSIZE+1]; 15
//클라와 데이터 통신
while(1) 16
{
retval = recv(client_sock,buf,BUFSIZE,0); 17
if(retval == SOCKET_ERROR)
{
err_display("recv()");
break;
}
else if(retval == 0)
{
break;
}
//받은 데이터 출력
buf[retval] = '\0'; 18
printf("[TCP/%s:%d] %s\n",
inet_ntoa(clientaddr.sin_addr),
ntohs(clientaddr.sin_port ), buf);
//데이터 보내기
retval = send(client_sock,buf,retval,0);
if(retval == SOCKET_ERROR)
{
err_display("send()");
break;
}
}
- 입력 문자열 길이를 계산할 때 사용한다. [본문으로]
- fgets() 함수를 이용해 사용자로부터 문자열을 입력받는다. [본문으로]
- 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
- 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
- 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
- 사용자가 입력한 문자열 또는 서버로부터 받은 데이터를 저장할 버퍼다. [본문으로]
- \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
- \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
- 글자를 입력하지 않고 엔터 키만 눌렀을 시 루프를 빠져나간다. [본문으로]
- \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
- \n 문자를 제거한다.데이터 출력 시 줄바꿈 여부를 서버가 결정하도록 하기 위함이다. [본문으로]
- send() 함수를 호출하고 오류 처리를 한다. 블로킹 소켓을 사용하므로 send() 함수의 리턴값은 strlen(buf) 값과 같게 된다. [본문으로]
- recvn() 함수를 호출하고 오류처리를 한다. 서버가 보낼 데이터의 크기를 미리 알고 있으므로 recvn() 함수를 사용하는 것이 편리하다. [본문으로]
- 받은 데이터 끝에 \0 을 추가하고 화면에 출력한다. [본문으로]
- 받은 데이터를 저장할 애플리케이션 버퍼다. [본문으로]
- recv() 함수를 호출하고 오류 처리 한다.서버는 받을 데이터 크기를 미리 알 수 없으므로 recvn() 함수를 사용할 수 없다. [본문으로]
- recv() 함수의 리턴값이 0 (정상종료) 또는 SOCKET_ERROR 가 될때까지 계속 루프를 돌며 데이터를 수신한다. [본문으로]
- 받은 데이터 끝에 \0 을 추가하고 화면에 출력한다. [본문으로]
'Windows > Network Programming' 카테고리의 다른 글
데이터 전송 함수 및 소켓 데이터 구조체 (0) | 2011.07.16 |
---|---|
TCP Client 분석 (0) | 2011.07.15 |
TCP Server 분석 (0) | 2011.07.15 |
TCP Server / Client (0) | 2011.07.15 |