---------------------------클라이언트---------------------------------------------------
//데이터 통신에 사용할 변수
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 |