WinSock2 네트워크 프로그래밍 단계(서버측)

1. 구조 함수에서 소켓 대상 및 기타 제어 변수 초기화
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

 m_hSocket = NULL;

 isServerStart=FALSE;

 ChatEnable=FALSE;

2, WSAstartup 함수를 호출하여 WinSock DLL 초기화
 WSADATA wsaData;//

 WORD version = MAKEWORD(2, 0);//   

 int ret = WSAStartup(version, &wsaData);//  0       

 if(ret != 0)

  TRACE("Initilize Error!
");

3. Socket 소켓 만들기
//AF_INET   Internet     ,SOCK_STREAM       (   SOCK_DGRAM),0  TCP/IP  

m_hSocket = socket(AF_INET, SOCK_STREAM,0);

  if (m_hSocket==INVALID_SOCKET)

  {

   AfxMessageBox("Socket Create Error!");

   return;

  }

4、로컬 주소와 소켓을 바인딩
m_addr.sin_family = AF_INET;//Internet 

m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//    

m_addr.sin_port = htons(1029);//   

int ret = 0;

int error = 0;

ret = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));//  

error = WSAGetLastError();

if(ret == SOCKET_ERROR)

{

    list->AddString("   :Bind Error!");

    return ;

}

5. 감청 스레드 만들기
DWORD dwthread;//unsigned long  

::CreateThread(NULL,0,listenthread,(LPVOID)m_hSocket,0,&dwthread);//listenthread           ,(LPVOID)m_hSocket       

6. 스니퍼 Listen 함수 호출
 DWORD WINAPI listenthread(LPVOID lpparam)//                                       LPVOID lpparam

{    

    SOCKET m_socket=(SOCKET)lpparam;//            



    int ret;

    ret=listen(m_socket,30);

    if(ret==SOCKET_ERROR)

    {

        ListInfo=_T("Listen Error!");

        return 0;

    }



    SOCKET s;

    s=accept(m_socket,NULL,NULL);

    DWORD dwthread;

    ::CreateThread(NULL,0,Recvthread,(LPVOID)s,0,&dwthread);    

    ::CreateThread(NULL,0,Sendthread,(LPVOID)s,0,&dwthread);

    return 0;



}

7. 메시지 수신과 메시지 발송 순환
//    Recvthread



while(1)



{

    ret=recv(m_socket,buff,256,0);

    if(ret==SOCKET_ERROR)

    {

        ListInfo=_T("Socket Receive Error!");

        closesocket (m_socket);

    }

    buff[ret]='\0';

    CString str;

    str="   :";

    str=str+buff;

    ListInfo=str;

}



//    Sendthread



while(1)

{

    if (ChatInfo.GetLength()>0)

    {

    ret=send(m_socket,ChatInfo,ChatInfo.GetLength(),0);

    if(ret==SOCKET_ERROR)

    {

        ListInfo=_T("   :Data send error!");

        return -1;

    }

    ListInfo=_T("");

    ListInfo+=ChatInfo;

    ChatInfo.Empty();    

}

좋은 웹페이지 즐겨찾기