소켓 통신 프로그래밍
API / 클래스 | 설명 | 제공 기능 | OS/PL | |
Unix | Socket API | 네트워크 표준 API | TCP, UDP 등 다양한 네트워크에 사용 | Unix(Ubuntu, Redhat..) |
Win | WinSock2 API | Socket API 윈도우 버전 | Window(C/C++) | |
C# .NET |
Sockets | WinSock2 API C# 버전 | Window(C#) | |
TcpClient | Sockets 클래스 내재됨 | TCP, UDP 전용 | ||
TcpListner | ||||
UdpClient |
윈도우 소켓 실행 흐름
WSA(WinSock API)
WSAStartup( )
: winsock 초기화 : 반드시 프로그램에서 요구하는 winsock 버전을 명시하고, 라이브러리 초기화를 진행해야 한다.
#include <winsock2.h>
int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
// 성공시 0, 실패시 0이 아닌 에러코드
// wVersionRequired : 윈속 버전 정보
// lpWSAData : WSADATA 구조체 변수 포인터
WSAStartup(MAKEWORD(2,2), &wsaData)
// MAKEWORKD 매크로를 이용해 윈도우 소켓 버전을 명시한다.
// winsock 버전 1.2의 경우, MAKEWORD(1, 2)는 0x0102 상위 8비트 주 버전 1, 하위 8비트 부 버전 2
// winsock 버전 2.2의 경우, MAKEWORD(2, 2)는 0x0202 상위 8비트 주 버전 2, 하위 8비트 부 버전 2
int main(int argc, char* argv[])
{
WSADATA wsaData;
...
if(WSAStartup(MAKEWORD(2,2), &wsaData))
ErrorPrint("WSAStartup() error!");
...
return 0;
}
WSAcleanup( )
: winsock 해제
int WSAStartup(void);
// 성공시 0; 실패시 SOCKET_ERROR
Window Socket 관련 함수
: 리눅스 기반의 소켓 함수와 큰 차이가 없다.
: 소켓 핸들을 사용한다.
SOCKET WSAAPI socket( int af, int type, int protocol );
// 성공시 소켓 핸들, 실패시 INVALID_SOCKET
int bind( SOCKET s, const sockaddr *addr, int namelen );
// 성공시 소켓 핸들, 실패시 SOCKET_ERROR
int WSAAPI listen( SOCKET s, int backlog );
// 성공시 0, 실패시 SOCKET_ERROR
SOCKET WSAAPI accept( SOCKET s, sockaddr *addr, int *addrlen );
// 성공시 소켓 핸들, 실패시 INVAILD_SOCKET
int WSAAPI connect( SOCKET s, const sockaddr *name, int namelen );
// 성공시 0, 실패시 SOCKET_ERROR
int WSAAPI closesocket( SOCKET s );
// 성공시 0, 실패시 SOCKET_ERROR
Window 입출력 함수
: 리눅스 read/write, send/recv
: 윈도우 - / - , send/recv
int send(
SOCKET s, // 소켓 핸들값
char *buf, // 전달할 데이터 버퍼의 주소값
int len, // 전달할 바이트 수
int flags // 전달할때 옵션
);
// 성공시 수신 바이트 수, 실패시 SOCKET_ERROR
int recv(
SOCKET s, // 소켓 핸들값
char *buf, // 전달받을 데이터 버퍼의 주소값
int len, // 전달받을 바이트 수
int flags // 전달받을때 옵션
);
// 성공시 수신 바이트 수, 실패시 SOCKET_ERROR