标题:adsl能建聊天程序吗
只看楼主
人生是什么
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-7-5
结帖率:0
已结贴  问题点数:20 回复次数:2 
adsl能建聊天程序吗
我用的是网通的ADSL宽带上网,想编个聊天程序,在Internet网上用,不知能行吗?怎么实现?
搜索更多相关主题的帖子: 聊天 Internet 
2012-07-05 23:36
flzt5354
Rank: 2
等 级:论坛游民
帖 子:3
专家分:20
注 册:2009-9-25
得分:20 
可以,前段时间我编过,用多线程编程,1个线程负责接收数据,一个线程负责发送数据
程序代码:
BOOL CChatDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // Add "About..." menu item to system menu.
    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }
    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    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);
    //设置默认服务器地址
    SetDlgItemText(IDC_SEV_ADDR,"sosh.vicp.cc");
    return TRUE;  // return TRUE  unlesBOOL CChatDlg::InitSocket()
{
    //创建套接字
    m_socket=socket(AF_INET,SOCK_DGRAM,0);
    if (INVALID_SOCKET==m_socket)
    {
        MessageBox("套接字创建失败!");
        return FALSE;
    }
    SOCKADDR_IN addrSock;
    addrSock.sin_family=AF_INET;
    addrSock.sin_port=htons(6000);
    addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    int retval;
    //绑定套接字
    retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
    if (SOCKET_ERROR==retval)
    {
        closesocket(m_socket);
        MessageBox("绑定失败!");
        return FALSE;
    }
    return TRUE;
}
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
    // 获取主线程传递的套接字和窗口句柄
    SOCKET sock=((RECVPARAM*)lpParameter)->sock;
    HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
    SOCKADDR_IN addrFrom;
    int len=sizeof(SOCKADDR);
    char recvBuf[1000];
    char tempBuf[2000];
    int retval;


    while (TRUE)
    {
        //接收数据
        retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
        if (SOCKET_ERROR==retval)
        {
            break;
        }
        CString ipstr=inet_ntoa(addrFrom.sin_addr);
        if (ipstr=="127.0.0.1")
        {
            sprintf(tempBuf,"我 说: %s",recvBuf);
        }
        else
        {
          sprintf(tempBuf,"%s 说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
        }
   
    
        ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
    }
  return 0;
}
void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
    //取出接收到的数据
    CString str=(char*)lParam;
    CString strTemp;

    //获取当前系统时间
    ctime=CTime::GetCurrentTime();
    //格式化获取的时间
    strtime=ctime.Format("发送时间(%H:%M:%S)");
    //获得已有数据
    GetDlgItemText(IDC_EDIT_RECV,strTemp);
    /*
    str+="\r\n";
    str+=strTemp;
    */

   
        strTemp+=strtime;
        strTemp+="\r\n";
        strTemp+=str;
        strTemp+="\r\n\r\n";
    


    //显示所有接收到的数据
    SetDlgItemText(IDC_EDIT_RECV,strTemp);
    //编辑框滚动条控制
    CEdit* pEdit = (CEdit*)this->GetDlgItem(IDC_EDIT_RECV);
    if (pEdit != NULL)
    {
        pEdit->LineScroll(pEdit->GetLineCount());
}
}
void CChatDlg::OnBtnSend()
{
    // TODO: Add your control notification handler code here
    //获取对方IP
    /*
    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));
    sendto(m_socket,strSend,strSend.GetLength()+1,0,
           (SOCKADDR*)&addrToMe,sizeof(SOCKADDR));
    //清空发送编辑框中的内容
    SetDlgItemText(IDC_EDIT_SEND," ");

    GetDlgItem(IDC_EDIT_SEND)->SetFocus();
}
void CChatDlg::OnServerl()
{
    // TODO: Add your control notification handler code here

    CString Sertext,Ipaddr;
    GetDlgItemText(IDC_SERVERL,Sertext);

        if (Sertext=="登陆服务器[未连接]")//登陆服务器获取服务器IP
        {
        CString strServerlName;
        HOSTENT* pHost;
    

        addrTo.sin_family=AF_INET;
        addrToMe.sin_family=AF_INET;
        addrTo.sin_port=htons(6000);
        addrToMe.sin_port=htons(6000);
        GetDlgItemText(IDC_SEV_ADDR,strServerlName);
        pHost=gethostbyname(strServerlName);
        addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
        addrToMe.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
        SetDlgItemText(IDC_SERVERL,"服务器[已经连接]");

        }

        else
        {
   
            MessageBox("服务器已经重新链接!");
            CString strServerlName;
            HOSTENT* pHost;
       
       
            addrTo.sin_family=AF_INET;
            addrTo.sin_port=htons(6000);
       
       
            GetDlgItemText(IDC_SEV_ADDR,strServerlName);
            pHost=gethostbyname(strServerlName);
            addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
            if (strServerlName=="sosh.vicp.cc")
            {
                   SetDlgItemText(IDC_SERVERL,"服务器[已经连接]");
            }
            else
            {
            SetDlgItemText(IDC_SERVERL,"目标地址[已经连接]");
            }

        }


}
s you set the focus to a control
}
这是主要的代码,你自己看看吧

 
2012-07-06 21:02
人生是什么
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-7-5
得分:0 
谢谢,我是问没有固定IP,能在公网上使用我所编的聊天程序吗?
2012-07-06 21:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-372841-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.516165 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved