#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#define BUFSIZE 30
void ErrorHandling(char *message);
int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET hRecvSock;
SOCKET hSendSock;
SOCKADDR_IN recvAddr;
SOCKADDR_IN sendAddr;
int sendAddrSize, strLen;
char buf[BUFSIZE];
if(argc!=2){
printf("Usage : %s <port>\n", argv[0]);
exit(0);
}
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) /* Load Winsock 2.2 DLL */
ErrorHandling("WSAStartup() error!");
hRecvSock=socket(PF_INET, SOCK_STREAM, 0);
if(hRecvSock==INVALID_SOCKET)
ErrorHandling("socket() error");
memset(&recvAddr, 0, sizeof(recvAddr));
recvAddr.sin_family=AF_INET;
recvAddr.sin_addr.s_addr=htonl(INADDR_ANY);
recvAddr.sin_port=htons(atoi(argv[1]));
if(bind(hRecvSock, (struct sockaddr*)&recvAddr, sizeof(recvAddr))==SOCKET_ERROR)
ErrorHandling("bind() error");
if(listen(hRecvSock, 5)==SOCKET_ERROR)
ErrorHandling("listen() error");
sendAddrSize=sizeof(sendAddr);
hSendSock=accept(hRecvSock, (SOCKADDR*)&sendAddr, &sendAddrSize);
Sleep(1);// 123 이란 데이터가 확실히 들어 가기 위해 시간 설정 gap 을 둠
strLen=recv(hSendSock, buf, sizeof(buf)-1, MSG_PEEK);
// MSG_PEEK 버퍼의 읽어 드린 데이타가 지워 지지 않고 남아 있다
buf[strLen]=0;
printf("총 %d 바이트 존재합니다 : %s\n", strLen, buf);
strLen=recv(hSendSock, buf, sizeof(buf)-1, 0);
/*MSG_DONTWAIT(일부분 데이타가 유무와 상관없이 리턴한다:
일반적으로 데이타가 비어 있으면 데이타가 수신대기(블럭킹 상태) 가되는 것을 방지 하여 그냥 리턴 해버려라 하는 명령)
*/
buf[strLen]=0;
printf("읽어 온 결과 입니다. : %s\n", buf);
closesocket(hSendSock);
WSACleanup();
return 0;
}
void ErrorHandling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
'TCP IP' 카테고리의 다른 글
readv & writev 함수의 사용 (0) | 2010.03.10 |
---|---|
긴급 데이타전송 시 생성되는 패킷 과 특징 (0) | 2010.03.10 |
recv & send (데이터의 송 수신) (0) | 2010.03.10 |
select 함수 를 이용한 io 멀티 플렉싱 서버구현 (0) | 2010.03.09 |
소켓의 생성과 종료 (0) | 2010.02.19 |