본문 바로가기

Study/Programming

윈도우 기반의 소켓관련 함수


안녕하세요


꼬로미입니다~ 오늘은 화요일!


오늘도 알차게 한번 달려봅니다~~~


오늘 포스팅은 윈도우 기반의 소켓관련 함수에 대해서 포스팅 합니다><


윈도우에서 사용하는 소켓함수도 리눅스에서 사용하는 함수와 크게 다르지 않아요


<리눅스 소켓 생성 함수 보러가기>


<리눅스 파일조작 함수 보러가기>




그럼 윈도우 소켓 함수들을 살펴볼게요



소켓 생성


 #include <winsock2.h>


SOCKET socket(int af, int type, int protocol);

->  소켓핸들 반환, 실패 시 INVALID_SOCKET 반환




IP주소와 포트번호 할당


 #include <winsock2.h>


int bind(SOCKET s, const struct sockaddr * name, int namelen);

->  O 반환, 실패 시 SOCKET_ERROR 반환




연결요청 상태로 변경


 #include <winsock2.h>


int listen(SOCKET s, int backlog);

->  O 반환, 실패 시 SOCKET_ERROR 반환




연결요청의 수락


 #include <winsock2.h>


SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);

->  소켓 핸들 반환, 실패 시 INVLID_SOCKET 반환




연결요청


 #include <winsock2.h>


int connect(SOCKET s, const struct sockaddr * name, int namelen);

-> O 반환, 실패 시 SOCKET_ERROR 반환


소켓기반의 클라이언트 프로그램에서 연결요청을 하지요




소켓 닫기


 #include <winsock2.h>


int closesocket(SOCKET s);

->  O 반환, 실패 시 SOCKET_ERROR 반환


리눅스에서는 close 함수를 사용하지만

윈도우에서는 closesocket함수를 사용합니다








윈도우 소켓 기반 입출력 함수


리눅스는 파일 입출력 함수인 read, write를 이용해 데이터도 송수신하는데

윈도우는 파일 입출력 함수와 소켓 입출력 함수가 구분되어 리눅스의 read, write 함수를 사용할 수 없어

입출력 함수로 sendrecv 함수를 사용합니다




파일 전송 send 함수


 #include <winsock2.h>


int send(SOCKET s, const char * buf, int len, int flags);

->  전송된 바이트 수 반환, 실패 시 SOCKET_ERROR 반환

s : 데이터 전송 대상과 연결을 의미하는 소켓 핸들 값

buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 값

len : 전송할 바이트 수

flags : 데이터 전송시 적용할 옵션 정보





파일 수신 recv 함수


 #include <winsock2.h>


int recv(SOCKET s, const char * buf, int len, int flags);

->  수신한 바이트 수(EOF 시 0), 실패 시 SOCKET_ERROR 반환

s : 데이터 수신 대상과 연결을 의미하는 소켓 핸들 값

buf : 수신된 데이터를 저장할 버퍼 주소 값

len : 수신할 최대 바이트 수

flags : 데이터 수신 시 적용할 다양한 옵션 정보





윈도우 소켓과 리눅스 소켓을 비교해서 보면 


반환형과 매개변수들이 조금씩 차이가 있지만 기능별로 함수의 이름이 거의 같은 것을 알 수 있어요


리눅스에서는 파일생성, 소켓생성에 파일디스크립터가 반환되는데


윈도우에서는 시스템 함수 호출을 통해 파일 생성시 핸들(handle)이라는 것을 반환해요