| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 674 人关注过本帖
标题:MFC socket通信
只看楼主 加入收藏
zsy012
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-11-11
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
MFC socket通信
服务器端程序

程序代码:


BOOL CTCP_SERVER_MFCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // 省略若干代码
    // TODO: 在此添加额外的初始化代码
    addr.sin_family=AF_INET;
    addr.sin_port=htons(2978);
    addr.sin_addr.S_un.S_addr=INADDR_ANY;

    s=::socket(AF_INET,SOCK_STREAM,0);
    ::bind(s,(sockaddr*)&addr,sizeof(addr));
    ::listen(s,5);
    GetDlgItem(IDC_TEXT)->EnableWindow(false);
    GetDlgItem(IDC_ADDR)->SetWindowText(_T("服务器监听已经启动!"));
    ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

LRESULT CTCP_SERVER_MFCDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
    CString str;
    char cs[100]={0};
    MessageBox(_T("进入socket函数"));
    GetDlgItem(IDC_TEXT)->EnableWindow(true);
    switch(WSAGETSELECTEVENT(lParam))
    {
        case FD_ACCEPT:
            {
                MessageBox(_T("进入accept函数"));
                int length=sizeof(addr1);
                s1=::accept(s,(sockaddr*)&addr1,&length);
                str.Format(_T("有1个客户已经连接上了"));
                GetDlgItem(IDC_TEXT)->SetWindowText(str);
                str+=::inet_ntoa(addr1.sin_addr);
                str+="登录\n";
                GetDlgItem(IDC_TEXT)->SetWindowText(str);
            }
            break;
        case FD_READ:
            {
                MessageBox(_T("进入recv函数"));
                CString num;
                ::recv(s1,cs,100,0);
                GetDlgItem(IDC_TEXT)->GetWindowText(num);
                num+="\n";
                num+=(LPTSTR)::inet_ntoa(addr1.sin_addr);
                num+="对您说:";
                num+=(LPTSTR)cs;
                GetDlgItem(IDC_TEXT)->SetWindowText(num);
            }
            break;
    }
    return 0;
}


void CTCP_SERVER_MFCDlg::OnBnClickedSend()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str;
    GetDlgItem(IDC_SENDTEXT)->GetWindowText(str);
    if(str==" ")
        MessageBox(_T("消息不能为空!"));
    else
    {
        if(::send(s1,(const char*)str.GetBuffer(1),sizeof(str),0)!=SOCKET_ERROR)
        {
            GetDlgItem(IDC_TEXT)->SetWindowText(_T("消息已经发送到客户端!\n"));
            GetDlgItem(IDC_TEXT)->GetWindowText(str);
            str+="\n";
            GetDlgItem(IDC_TEXT)->SetWindowText(str);
        }
        else
            GetDlgItem(IDC_TEXT)->SetWindowText(_T("消息发送失败!\n"));
    }
}




客服端程序
程序代码:


BOOL CTCP_CLIENT_MFCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // 省略若干程序
    // TODO: 在此添加额外的初始化代码
    GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);
    GetDlgItem(IDC_SEND)->EnableWindow(false);

    s=::socket(AF_INET,SOCK_STREAM,0);
    ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET, FD_READ);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CTCP_CLIENT_MFCDlg::OnBnClickedConnect()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str,str1;
    int port;
    GetDlgItem(IDC_ADDR)->GetWindowText(str);
    GetDlgItem(IDC_PORT)->GetWindowText(str1);
    if(str==""||str1=="")
    {
        MessageBox(_T("服务器地址或端口不能为NULL"));
    }
    else
    {
        port=atoi((const char*)str1.GetBuffer(1));
        addr.sin_family="127.0.0.1";
        addr.sin_addr.S_un.S_addr=inet_addr((const char*)str.GetBuffer(1));
        addr.sin_port=ntohs(port);
        GetDlgItem(IDC_TEXT)->SetWindowText(_T("正在连接服务器......\r\n"));
        if(::connect(s,(sockaddr*)&addr,sizeof(addr)))
        {
            GetDlgItem(IDC_TEXT)->GetWindowText(str);
            str+="连接服务器成功!\r\n";
            GetDlgItem(IDC_TEXT)->SetWindowText(str);
            GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
            GetDlgItem(IDC_SEND)->EnableWindow(true);
            GetDlgItem(IDC_ADDR)->EnableWindow(false);
            GetDlgItem(IDC_PORT)->EnableWindow(false);
        }
        else
        {
            GetDlgItem(IDC_TEXT)->GetWindowText(str);
            str+="连接服务器失败!请重试\r\n";
            GetDlgItem(IDC_TEXT)->SetWindowText(str);
            MessageBox(_T("connect error!"));
        }
    }
}

void CTCP_CLIENT_MFCDlg::OnBnClickedSend()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str,str1;
    GetDlgItem(IDC_SENDTEXT)->GetWindowText(str);
    if(str=="")
    {
        GetDlgItem(IDC_TEXT)->GetWindowText(str1);
        //str1+="\r\n";
        str1+="消息不能为空\r\n";
        GetDlgItem(IDC_TEXT)->SetWindowText(str1);
    }
    else
    {
        ::send(s,(const char*)str.GetBuffer(1),sizeof(str),0);
        GetDlgItem(IDC_TEXT)->GetWindowText(str1);
        str1+="\r\n";
        str1+=str;
        GetDlgItem(IDC_TEXT)->SetWindowText(str1);
    }
}

LRESULT CTCP_CLIENT_MFCDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
    char cs[100]={0};
    if(WSAGETSELECTEVENT(lParam)==FD_READ)
    {
        CString num;
        recv(s,cs,100,0);
        GetDlgItem(IDC_TEXT)->GetWindowText(num);
        num+="\r\n服务器说:";
        num+=(LPTSTR)cs;
        GetDlgItem(IDC_TEXT)->SetWindowText(num);
    }
    return 0;
}



发现服务器端程序根本就没有进入函数LRESULT CTCP_SERVER_MFCDlg::OnSocket(WPARAM wParam, LPARAM lParam),accept函数也就没有执行,网络连接不成功,网上好像也有很多人碰见这样的问题,但是感觉都没有解决,这到底是什么问题,跪求高手指点!!!
搜索更多相关主题的帖子: 服务器 通信 
2013-11-11 16:10
流年!
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:107
注 册:2013-11-7
收藏
得分:10 
你使用socket之前有没有初始化socket啊
初始化代码
WSADATA     wsaData;
    int err;
    if((err = WSAStartup(0x0002, &wsaData)) != 0)
    {
        return FALSE;
    }
2013-11-14 14:08
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:10 
有errorcode的。
不过错误应该就是如楼上说说了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-11-14 16:24
快速回复:MFC socket通信
数据加载中...
 
   



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

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