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

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 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题