标题:VS2008下Unicode中UDP的问题
只看楼主
Fungigv
Rank: 2
等 级:论坛游民
帖 子:13
专家分:25
注 册:2014-9-21
结帖率:100%
已结贴  问题点数:10 回复次数:2 
VS2008下Unicode中UDP的问题
我有一个程序,采用了上述的环境,但只能接收一个字符,代码如下:
接收:
    AfxSocketInit();                    // 初始化WinSock   
    CSocket sockServ;                    // 创建一个CSocket类对象
    sockServ.Create(Dlg->m_uintPRecv);    // 创建底层套接字句柄,并设置其端口
    sockServ.Listen();                    // 开始监听客户端请求
    char RecvBuf[100];                    // 接收缓冲区字符串
    CSocket sockRecv;                    // 用于和客户端通信的Socket对象

    while (TRUE)
    {
        sockServ.Accept(sockRecv);        // 接收用户请求并和sockRecv底层套接字绑定进行通信   
        sockRecv.Receive(RecvBuf,100);    // 接收流式套接字数据传递到数据缓存区
        sockRecv.Close();                // 关闭接收数据套接字
        CString RecvText;
        RecvText.Format(_T("%s\r\n"),_T("对方:"));
        Dlg->m_strRecv += RecvText;
        Dlg->m_strRecv += RecvBuf;
        Dlg->m_strRecv += "\r\n";        
                ...
    }
发送:
    AfxSocketInit();                    // 初始化WinSock
    CSocket sockClient;                    // 创建一个CSocket类对象
    sockClient.Create();                // 客户端不需要绑定端口和地址,所以用默认参数
    sockClient.Connect(m_strIP, m_uintPSend);  // 使用流式套接字需要事先建立客户机和服务端的连接   
    sockClient.Send(m_strSend, m_strSend.GetLength()+1);    // 连接之后发送数据
    sockClient.Close();   
调试中RecvBuf发送ab缓冲区中的1、2、3、4分别是a、0、b、0,估计问题在这儿,如何转换?
菜鸟,望高人指点
搜索更多相关主题的帖子: Socket 缓冲区 字符串 客户端 
2015-02-12 21:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
Dlg->m_strRecv += RecvBuf; 这个地方错了,m_strRecv元素类型为TCHAR,而recvBuf元素类型为char(其内容又是wchar_t类型。)
这种错误,低级到无以复加,错误中套错误,已经没法给你讲清楚了。
一个简单糊弄(但不完全正确)过去的办法是改 char RecvBuf[100] 为 TCHAR RecvBuf[100],改sockClient.Send(m_strSend, m_strSend.GetLength()+1) 为 sockClient.Send( m_strSend, (m_strSend.GetLength()+1)*sizeof(TCHAR) )。

正确的方法是:
a. 双方预先确定好使用什么字符编码,不可以随便更改。也就是要么都用CStringA,要么都用CStringW,不可以用CString
b. A发送,并通过返回值判断是否发送完整,循环发送和判断,直到发送完整。
c. B接受,并通过返回值判断是否接受完整,循环接受和判断,直到接受完整。
……
2015-02-13 08:33
Fungigv
Rank: 2
等 级:论坛游民
帖 子:13
专家分:25
注 册:2014-9-21
得分:0 
谢谢!可能是我没学习透彻,以后绝不再犯这种错误了。

中华人民共和国万岁!  世界人民大团结万岁!
2015-02-13 10:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-441989-1-1.html




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

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