안녕하세요 허언증입니다.
UDP(Data GramSocket)프로토콜을 이용해서
Server & Client통신을 (채팅) 소스 예제 입니다.
참고 사이트
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/
Code : 2 ~ 3
WinSocket API 사용 추가
#include <WS2tcpip.h> 만 사용할 경우 lib 파일이 없어서 실행해도 오류 발생
#praga comment (lib , "ws2_32.lib") 를 통해 lib파일 사용한다고 명시.
Code : 9 ~ 13
WSADATA 구조체
: Windows의 소켓 초기화 정보를 저장하기위한 구조체
WSAStartup(소켓버전, WSADATA 구조체 주소)
: Socket 을 사용하려면 초기화를 해야한다!! (생성과 종료)
초기화에 성공을 하면 0을 반환 / 0이 아니면 오류 발생!
WSACLeanup()(소켓버전, WSADATA 구조체 주소)
: WSAStartup생성 했으니 WSACLeanup() 다시 없애준다 생성자와 소멸자
버전과 주소값을 받아 동작 유무를 확인하고 안 맞으면 에러발생
최근엔 대부분 OS가 win7 이상이기 때문에 에러발생이 없다고 봐도 무방하다
하지만 혹시 모를 상황을 대비해 입력한다.
Code : 17 ~ 21
IN 소켓을 만들고 정보를 입력 ( IPv4 , UDP , 0)
SOCKADDR_IN 구조체를 이용해서 serverHint 만들고 정보 입력을 한다
ADDR_ANY = 네트워크상 모든 IP수신 ("127.0.0.1" - 특정 IP 입력가능)
AF_INET = IPv4 방식
htons(27001) = 27001포트를 이용한다.
sin_family = 주소체계 / sin_port = port / sin_addr.S_un.S_addr = IP
소켓(IPv4 , UDP , 0 ) = IP (ADDR_ANY) + Port (27001)
Code : 23 ~ 26
bind()
: SOCKADDR_IN을 통해 IP 와 Port 번호를 받고 전 단계에 만들었던 소켓과 연결 함
bind(in, (sockaddr*)&serverHint, sizeof(serverHint)) == SOCKET_ERROR)
in 소켓에 serverHint 정보를 serverHint size 만큼 받는다
그 값이 SOCKET_ERROR 이면 Can't bind socket 문구 출력!
WSAGetLastError()
: 오류를 출력합니다.
Code : 32 ~ 33
: 문자를 받을 공간 확보 후 ZeroMemory() 통해 초기화
memset v.s ZeroMemory 차이가 뭐야?? Click!!
Code : 36 ~ 45
: ZeroMemory()로 다시한번 초기화를 하는 이유는 이전 데이터가 들어가 있으므로
초기화를 통해 데이터를 모두 없앤다.
recvfrom()
: 지정 소켓에다 클라이어트 측의 정보를 받는다
에러 코드가 발생시 SOCKET_ERROR 값을 반환 하고 WSAGetLastError를 통해 에러코드 확인
recv v.s recvfrom 차이가 뭐야?? Click!!
Code : 48 ~ 49
: 클라이언트 측 IP를 화면에 출력하기 위해 생성 및 초기화 작업
Code : 51 ~ 52
inet_ntoa()
: IPv4 주소를 ASCII 문자형태로 변환 ( IP -> ASCll 문자형으로)
주소체계 파헤치기 Click!! ( 제작 중.. )
Code : 55 ~ 59
: 소켓 종료 와 윈속 종료
Server측과 대부분 비슷하며, 42~48부분만 다름
Code : 42 ~ 48
: 서버측으로 데이터를 송신 할 때 사용
string을 사용해서 문자 전달
argv[]가 뭐지?? Click!! ( 제작 중.. )
'# Network > [ Coding ]' 카테고리의 다른 글
[허언증/네트워크] 데이터 분산 전송 (소켓프로그래밍) (0) | 2019.12.13 |
---|---|
[허언증/네트워크] 소켓 통신 프로그래밍 예제 (0) | 2019.11.25 |