注册 登录
编程论坛 C++教室

VS2008下Unicode中UDP的问题

Fungigv 发布于 2015-02-12 21:59, 611 次点击
我有一个程序,采用了上述的环境,但只能接收一个字符,代码如下:
接收:
    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,估计问题在这儿,如何转换?
菜鸟,望高人指点
2 回复
#2
rjsp2015-02-13 08:33
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接受,并通过返回值判断是否接受完整,循环接受和判断,直到接受完整。
……
#3
Fungigv2015-02-13 10:05
谢谢!可能是我没学习透彻,以后绝不再犯这种错误了。
1