네트워크는 전혀 안해보았는데
서버 , 클라이언트 프로그램을 만들던중 공부하면서 분석해본다.
주로 검색을 통해 하나하나 짚어본다.
ws2_32.lib 를 종속성에 추가해준다.
#define _WINSOCKAPI_ #include <windows.h> #include <winsock2.h> |
추가로
#include <iostream>
#include <vector>
#include <ctype.h>
Winsock2에 정의된 구조체를 선언한다.
예) WSADATA wsa;
Socket 생성
SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
serveradder 선언을 한다.
SOCKADDR_IN serveraddr;
ZeroMemory(&serveraddr, sizeof(serveraddr)); //메모리를 0으로 채운다.
serveraddr.sin_family = AF_INET; //소켓주소체계를 정의한다.
serveraddr.sin_port = htons(5555); //포트번호
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); //소켓에 주소할당
//retval 은 미리 선언해놓은 int형이며 if(retval == SOCKET_ERROR )처럼 에러를 리턴받는다.
listen(listen_sock, SOMAXCONN); // 연결요청 대기
Client 소켓 생성
SOCKET client_sock;
client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);
데이터 주고받는 부분
while(1)
{
retval = recv(client_sock, buf, BUFSIZE, 0);
if(retval == SOCKET_ERROR)
{
err_display("recv()");
break;
}
else if(retval == 0)
break;
buf[retval] = '\0';
printf("[%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;
}
}
소켓 릴리즈
closesocket(client_sock);
//리슨소켓종료
closesocket(listen_sock);
//윈속종료
WSACleanup();
UDP 서버,클라이언트 코드 참고
http://thdev.net/175
'C/C++' 카테고리의 다른 글
MFC 메모리릭 잡기 (0) | 2012.12.09 |
---|---|
(MEMO) 포인터와 변수참조 (0) | 2011.09.02 |