学习VC++深入浅出——网络通讯编程

来源:互联网 发布:c语言的发展前景 编辑:程序博客网 时间:2024/05/17 01:31
 学习VC++深入浅出——网络通讯编程
private:
    SOCKET m_socket;

#define WM_RECVDATA WM_USER+1

struct RECVPARAM
{
    SOCKET sock;
    HWND hwnd;
}
;

if(!AfxSocketInit())
    
{
        AfxMessageBox(
"加载套接字库失败!");
        
return false;
    }


BOOL CThreadChatDlg::OnInitDialog()
{
    InitSocket();

    RECVPARAM 
*pRecvParam = new RECVPARAM;
    pRecvParam
->sock = m_socket;
    pRecvParam
->hwnd = m_hWnd;
    HANDLE hThread 
= CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
    CloseHandle(hThread);

    }


BOOL CThreadChatDlg::InitSocket()
{
    m_socket 
=socket(AF_INET,SOCK_DGRAM,0);
    
if(INVALID_SOCKET == m_socket)
    
{
        MessageBox(
"套接字创建失败!");
        
return false;
    }

    SOCKADDR_IN addrSock;
    addrSock.sin_addr.S_un.S_addr 
= htonl(INADDR_ANY);
    addrSock.sin_family 
= AF_INET;
    addrSock.sin_port 
= htons(6000);
    
    
int retval;
    retval 
=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
    
if(SOCKET_ERROR == retval)
    
{
        closesocket(m_socket);
        MessageBox(
"绑定失败!");
        
return false;
    }

    
return true;
}


DWORD WINAPI CThreadChatDlg::RecvProc(LPVOID lpParameter)
{
    SOCKET sock 
=((RECVPARAM*)lpParameter)->sock;
    HWND hwnd 
= ((RECVPARAM*)lpParameter)->hwnd;
    delete lpParameter;

    SOCKADDR_IN addrFrom;
    
int len = sizeof(SOCKADDR);
    
char recvBuf[200];
    
char tempBuf[300];
    
int retval;
    
while(true)
    
{
        retval 
=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
        
if(SOCKET_ERROR == retval)
            
break;
        sprintf(tempBuf,
"%s 说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
        ::PostMessage(hwnd,WM_RECVDATA,
0,(LPARAM)tempBuf);
    }

    
return 0;
}

void CThreadChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
    CString str 
=(char*)lParam;
    CString strTemp;
    GetDlgItemText(IDC_EDIT_RECV,strTemp);
    str
+=" ";
    str 
+=strTemp;
    SetDlgItemText(IDC_EDIT_RECV,str);
}


void CThreadChatDlg::OnButtonSend() 
{
    
// TODO: Add your control notification handler code here
    DWORD dwIP;
    ((CIPAddressCtrl
*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);

    SOCKADDR_IN addrTo;
    addrTo.sin_family 
= AF_INET;
    addrTo.sin_port 
= htons(6000);
    addrTo.sin_addr.S_un.S_addr 
= htonl(dwIP);
    CString strSend;
    GetDlgItemText(IDC_EDIT_SEND,strSend);
    sendto(m_socket,strSend,strSend.GetLength()
+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
    SetDlgItemText(IDC_EDIT_SEND,
"");

}

原创粉丝点击