Server 흐름도
/////////////// 윈속 초기화 //////////////
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) //WSAStartup 성공:0, 실패:오류코드 이며, &wsa는 WSADATA타입 변수의 주소
//MAKEWORD는 주어진 상위, 하위 바이트를 조합하여 word 값을 반환합니다. return -1;
/////////////// 1.socket /////////////
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0); //socket(주소체계, 소켓 타입, 프로토콜)
/* SOCKET socket (
int af, // 주소 체계
int type, // 소켓 타입
int protocol // 프로토콜
) ;
성공: 새로운 소켓, 실패: INVALID_SOCKET
*/
if(sock==INVALID_SOCKET) err_quit("socket()"); //listen_sock의 리턴값이 INVALID_SOCKET이면 err_quit함수 호출
////////////// 2. setsockopt //////////
retval=setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&bEnable, sizeof(bEnable));
/* int setsockopt (
SOCKET s,
int level,
int optname,
const char* optval,
int optlen
) ;
성공: 0, 실패: SOCKET_ERROR
*/
if(retval==SOCKET_ERROR) err_quit("setsockopt()");
////소켓 주소 구조체 초기화
ZeroMemory(&addr,sizeof(addr)); //ZeroMemory는 구조체나 변수를 초기화, addr의 구조체 변수를 초기화
addr.sin_family=AF_INET;
addr.sin_port=htons(6127); //htons는 host byte order를 network byte order로 Port정보의 바이트 순서변경
addr.sin_addr.s_addr=inet_addr("192.168.0.255"); //192.168.0.0 ~ 192.168.0.255 다 뿌려줌
////////// 3.sendto /////////
int len=sendto(sock, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(addr));
/*int sendto (
SOCKET s,
const char* buf,
int len,
int flags,
const struct sockaddr* to,
int tolen
) ;
성공: 보낸 바이트 수, 실패: SOCKET_ERROR
*/
if(len == SOCKET_ERROR) err_quit("sendto()");
/////////////// 4.closesocket() ////////////////
closesocket(sock); //listen_sock 소켓을 닫음
// 윈속 종료
WSACleanup(); //성공:0, 실패:SOCKET_ERROR
UDP 서버가 hello라는 데이터를 보냄
/////////////// 윈속 초기화 //////////////
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) //WSAStartup 성공:0, 실패:오류코드 이며, &wsa는 WSADATA타입 변수의 주소
//MAKEWORD는 주어진 상위, 하위 바이트를 조합하여 word 값을 반환합니다. return -1;
//////////// 1.socket ///////////////
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock==INVALID_SOCKET) err_quit("socket()");
////소켓 주소 구조체 초기화
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6127);
addr.sin_addr.s_addr = inet_addr("192.168.0.127");
///////// 2.bind /////////
bind(sock,(SOCKADDR*)&addr, sizeof(addr));
////////// 3.recvfrom //////////
int len=recvfrom(sock, buf, BUFSIZE, 0, (SOCKADDR *)&peeraddr, &addrlen); /* int recvfrom (
SOCKET s,
char* buf,
int len,
int flags,
struct sockaddr* from,
int* fromlen
) ;
성공: 받은 바이트 수, 실패: SOCKET_ERROR
*/
///////// 4.closesocket() //////////
closesocket(sock);
// 윈속 종료
WSACleanup();
UDP client는 UDP server의 데이터와 정보를 보여줌
'시스템 프로그래밍 > 소켓프로그래밍' 카테고리의 다른 글
| UDP Server Client (0) | 2009/04/27 |
|---|---|
| Visual C++ 1대1 스레드를 이용한 Server와 Client (0) | 2009/04/24 |
| 스레드를 이용한 Server (0) | 2009/04/23 |



Prev
