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 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退
  • ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?