본문 바로가기

[ Windows Program ]/Windows API

클라이언트의 접속을 가능하게 하는 listen 함수

listen 함수는 특정 소켓을 클라이언트의 접속을 받을 수 있도록 만들어주는 함수입니다. 우리가 전화기를 사오고 전화번호를 할당받은뒤에는 뭘해야 할까요? 전화기 선을 연결해야겠죠. 그래야 전화가 걸려올테니까요. listen이 바로 그런 기능을 하는 함수입니다.

 

socket 함수로 소켓을 생성하고 bind 함수로 주소를 설정한 다음에는 이제 클라이언트가 접속할 수 있도록 listen 함수를 호출해주어야 합니다. 아래는 listen 함수의 형식입니다.

 

int listen( SOCKET s, int backlog );

 

s : 이 파라미터에는 bind된 소켓을 넣어줍니다. 이때 주의할점은 이미 listen된 소켓을 넣어주면 에러가 나게 됩니다. 주의하세요.

 

backlog : 연결큐에 최대 몇개의 연결 처리할 데이터를 담을지의 숫자. 대게 많은 사람들이 접속하지 않는다면 5정도면 됩니다.

 

함수가 성공되면 0을 리턴하고 실패하면 SOCKET_ERROR 를 리턴합니다. SOCKET_ERROR가 리턴되었을땐 WSAGetLastError 를 호출해서 자세한 에러정보를 볼 수 있습니다. 이 내용은 관련자료나 MSDN을 참고 하세요.

 

 

이 함수는 서버용 함수입니다. 클라이언트에선 이 함수는 쓰이지 않죠. 이 함수를 호출한 뒤부터는 이제 클라이언트의 접속을 받을 준비가 된겁니다. 하지만 실질적인 클라이언트의 접속요청을 처리하는 함수는 아니죠. 아직은 접속요청만 받게 된거지, 접속요청을 처리하는 루틴을 만들지 않았죠? 클라이언트의 접속요청을 처리하는 함수는 accept 입니다. 이는 블록(block)되는 함수인데 블록에 대해서는 다음 강좌에서 다루도록 하고, 여기까지 배운 내용을 다시 정리하는 의미로 한번 예제를 만들어 보았습니다.

 

물론 직접 컴파일해서 실행해보셔야 한다는점 알고계시죠? ^-^

 

 

#include <winsock2.h>

#incldue <windows.h>

 

#define PORT_NUM          7777

 

 

void main( void )

{

     WSADATA wsaData;

     SOCKET servSock;

     SOCKADDR_IN servAddr;

 

     if( WSAStartup( MAKEWORD(2, 2), &wsaData ) )

          goto LERR;

 

     servSock = socket( AF_INET, SOCK_STREAM, 0 );

     if( servSock == INVALID_SOCKET )

          goto LERR;

 

     // 주소정보를 채움

     servAddr.sin_family = PF_INET;

     servAddr.sin_addr.s_addr = htonl( INADDR_ANY );

     servAddr.sin_port = htons( PORT_NUM );

 

     if( bind( servSock, (struct sockaddr*)&servAddr, sizeof(servAddr) )

                         == SOCKET_ERROR )

     {

          closesocket( servSock );

          goto LERR;

     }

 

 

     // listen 함수!

     if( listen( servSock, 5 ) == SOCKET_ERROR )

     {

          closesocket( servSock );

          goto LERR;

     }

 

     puts( "Successe" );

     return;

 

LERR:

     puts( "ERROR!" );

}


- Reference

  http://cafe.naver.com/nevernding