2 u012814668 u012814668 于 2013.11.16 10:45 提问

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();
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!