purrneko 2013-11-16 02:45 采纳率: 0%
浏览 1350

MFC SOCKET的问题!!

意思是这样的,按了连接后监听 然后收发嘛 看网上说默认是阻塞的 但是我这个客户端先是给服务端发一个数字再发一个名字 服务端接收都没问题 然后给客户端回的时候瞬间就都发完了 客户端接收就是无限的一个相同的汉字(程序就死了) 不知道是连接断了还是说这是在飞阻塞状态呢。。 为什么会这样啊 求大侠分析

服务端点了连接之后:
if (!AfxSocketInit())
{
return 1;
}

m_exit = false;

CServer *aDlg = (CServer *)lParam;

UINT nPort = 6000;  //端口号

CSocket sockConn, serverSocket;

if (!sockConn.Socket())
{
    aDlg->m_ListWords.AddString("创建失败");
    return 1; 
}

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);

sockConn.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);

if (!sockConn.Bind(nPort)) //绑定
{
    aDlg->m_ListWords.AddString("绑定失败");        
    return 1; 
}

if(!sockConn.Listen(10)) //监听  可以连10个客户端
{   
    aDlg->m_ListWords.AddString("监听失败");    
    return 1;
}


aDlg->m_ListWords.AddString("=====开始监听=====");

CFootballApp *app1=(CFootballApp *)AfxGetApp();

while(!m_exit) //没有退出的话
{

    if(!sockConn.Accept(serverSocket)) //等待接入
    {
        continue;
    }
    else
    {
                   char recvBuf[20];
        serverSocket.Receive(recvBuf,1);
        aDlg->m_ListWords.AddString("收到:"+recvBuf[0]);

        switch(recvBuf[0])
        {
        case '1':{。。。
                    char sendBuf[20]; 
                        itoa(app1->c[i].cash,sendBuf,20);//转换数据类型
                CString a;
            a.Format("%d", app1->c[i].cash);
            sockConn.Send(a, a.GetLength());
            sockConn.Receive((void *)recvBuf, sizeof(recvBuf)); //收到确认后再继续发
                       。。。。。。。。。。。。。。
            }
  serverSocket.Close();

}
。。

客户端 点连接搜索后:
AfxSocketInit();
CSocket aSocket;

    CString strIP="127.0.0.2";
    int nPort = 6000;

    if(!aSocket.Create())
    {
        MessageBox("error");
        return;
    }

    if(aSocket.Connect(strIP, nPort))
    {
        char recvBuf[20] = {'\0'};

        aSocket.Send("1", 1);

        string name;
        CEdit *edit=(CEdit *)GetDlgItem(IDC_NAME); //声明指向编辑框的指针
        edit->GetWindowText(NAME);
        name=NAME.GetBuffer(0);
        aSocket.Send(name.c_str(), sizeof(name));//发送要查找的名字

        aSocket.Receive((void *)recvBuf, sizeof(recvBuf));

        if(recvBuf[0]!='!'){ //收到!代表没有找到此club
            mark=1;
            CString str;
            CEdit *edit=(CEdit *)GetDlgItem(IDC_cash); //首先接收到的是cash
            str.Format("%ch",recvBuf);
            edit->SetWindowText(str);
            aSocket.Send("ok", sizeof("ok")); //表示已接收 可继续发送

            aSocket.Receive((void *)recvBuf, sizeof(recvBuf));
            edit=(CEdit *)GetDlgItem(IDC_num); //接收到的是num
            str.Format("%ch",recvBuf);
            edit->SetWindowText(str);
            aSocket.Send("ok", sizeof("ok")); 
                           。。。。。。。。。。。。。。。。。。。
             }

aSocket.Close();
}

  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-20 23:46
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作