导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

用Socket传递整数时它需要htons和stoh来转换,那么对于CString类型的数据有对应的方法转换吗?

angelcool 2005-05-26 11:22:47
如题。
我在MSDN中没有找到对应的函数。是不是CString的不用转??
...全文
278 点赞 收藏 37
写回复
37 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
angelcool 2005-05-28
这个问题我会另开帖来问,请大家到时惠顾。^_^
回复
angelcool 2005-05-27
int recv (
SOCKET s,
char FAR* buf,
int len,
int flags
);
recv接收数据时就需要给定这个长度,你却说等接收后“先读4个字节,然后按得到的长度读进来”。

怎么回事??
回复
angelcool 2005-05-27
分太少,不够分。请到这个帖来
http://community.csdn.net/Expert/topic/4036/4036092.xml?temp=.2792017
这里分多,也该结帖了。
回复
modena 2005-05-27
1. 假设每次发送的报文均有一个Message_Param报头和一段数据,那么每次recv一个sizeof(Message_Param)的数据,如果判断是有效的Message_Param,那么再次接收nMsgLen尺寸的数据,与前一个报头连接形成的缓冲区就是你每个真正报文的数据。
2. 事实上如果你用SOCKET_RAW方式接收报文,真正的报文前面都有一小段数据用来记录报文的类型,协议,长度等信息,但我们通常不需要关心这些内容。
3. 这并不是报文重组,只是接收报文的一种方式,一般的报文需要定义一些必要的报头信息如序列号,关联性等信息。
4. 我们知道,TCP其实是以流方式发送,并不存在错序的问题,但UDP报文就可能会后发送的先到达,同时UDP报文但超过一定大小的时候一般都会失败,这时只能对报文进行分片发送,等等诸如此类的问题,都牵涉到客户端需要重新开各线程,对接收到的数据进行序列化、重组等操作
回复
angelcool 2005-05-27
------------------------------------------------
recv长度sizeof(Message_Param)后在recv长度nMsgLen,然后进行报文重组
------------------------------------------------
原来是我没看明白.

可不可以将一下:如何进行报文的重组.
这两天整这个通讯,头都大了.反映太慢请见谅.
回复
modena 2005-05-27
另外声明,这只是一种处理方式,具体应用的目标不同,应该因地制宜
回复
modena 2005-05-27
如果偶尔有一次需要发送1024的数据,大部分数据都小于200byte怎么办?如果很多情况下只需要传递一些命令和通知怎么处理?

typedef struct _Message_Parm{
int nMsgType;
int nMsgLen;
char userData[1];
}Message_Param;

WCHAR szMsg[200];
wcscpy( szMsg, L"Message to send!" );
PMessage_Param pBuffer = (PMessage_Param )CoTaskMemAlloc( sizeof(Message_Param) + nMsgLen );
pBuffer->nMsgType = ...;
pBuffer->nMsgLen = wcslen(szMsg) * sizeof(WCHAR) + 2;
memcpy( (void *)userData, (void *)szMsg, pBuffer->nMsgLen + 2 );

// send pBuffer here. send size : sizeof(Message_Param) + pBuffer->nMsgLen + 2;
...

::CoTaskMemFree( pBuffer );
回复
angelcool 2005-05-27
sizeof(Message_Param)不正是传递的消息的长度吗?如果这样添加接收会出错的??
如果这样是对的,那我的理解是,在userData虽定义长度为1,但是它的长度随赋值自动改变。
如果是这样,你说的还行。
不知道我的理解对不对??


typedef struct _Message_Parm{
int nMsgType;
char userData[200];
}Message_Param;
我就这样改的,很占空间并影响速度,但是安全。

回复
modena 2005-05-27
typedef struct _Message_Parm{
int nMsgType;
int nMsgLen;
char userData[1];
}Message_Param;

send的长度指定为sizeof(Message_Param) + nMsgLen;
recv长度sizeof(Message_Param)后在recv长度nMsgLen,然后进行报文重组
回复
vcmute 2005-05-26
一般不会传CString吧,都是传char数组
因为char是一个字节,所以就需要高低字节转换,纯粹二进制数组
回复
angelcool 2005-05-26


我想问主机字节和网络字节的转换。它们的参数都是长、短整形。
那么CString类的转换函数是什么??
回复
rabo 2005-05-26
atol(str);
回复
redchina 2005-05-26
我一般是将整个报文长度放在最前面4个字节,先读4个字节,然后按得到的长度读进来。
----------------
这个通过指针不就可以做到么?
回复
angelcool 2005-05-26
to ggw(格格巫)
之所以分隔是为获得不同的参数。
----------------
我一般是将整个报文长度放在最前面4个字节,先读4个字节,然后按得到的长度读进来。
----------------
没有读进来又怎么能“先读”前4个字节呢?不懂你的意思。
回复
ggw 2005-05-26
不用!TCP不分界,是一串字节流。我一般是将整个报文长度放在最前面4个字节,先读4个字节,然后按得到的长度读进来。看一下以送函数的原形,好象是个void *.
回复
yiyezhiqiu 2005-05-26
回复
angelcool 2005-05-26
typedef struct _Message_Parm{
int nMsgType;
char userData[200];
}Message_Param;

我改成这样。
出现了很多“屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯”
是什么原因??
我的代码如下:
组合代码:
CString strUserData;
strUserData.Format("%d/\r\r%d/\r\r",x, y);//x,y为需要传递的信息

Message_Param * msg = new Message_Param;
msg->nMsgType = htons(message);
strcmp(msg->userData, strUserData);
分解代码:
int nKeyX, nKeyY;
Message_Param * msg = (Message_Param *)wParam;
int message = ntohs(msg->nMsgType);
CString m_strMsg = "";
CString m_strOldMsg = "";
CString tempStr = "";
CString strCRLF = "\r\r";

int nFindPosition = m_strMsg.Find(strCRLF);
if( nFindPosition != -1)
{
tempStr = m_strMsg.Left(nFindPosition);
m_strOldMsg = m_strMsg.Right(m_strMsg.GetLength() -
nFindPosition - strCRLF.GetLength());
nKeyX = atoi( tempStr );
m_strMsg = m_strOldMsg;
nFindPosition = m_strMsg.Find(strCRLF);
}

m_strMsg = CString( msg->userData, 200);

发送的信息是正确的,但是接收的时候就出现了很多“屯屯屯屯屯屯屯屯”。
请帮我看看是哪里有问题。
谢谢!!
回复
angelcool 2005-05-26
typedef struct _Message_Parm{
int nMsgType;
char userData[1024];
}Message_Param;

这样定义可以吗??
回复
angelcool 2005-05-26
我被说晕了。
那就是说这样做实际上是不可行的。

那对于一个不定长的信息应该传送比较安全呢?
回复
alino 2005-05-26
可不可以设定一个定值如1024,每次都以这个长度接收数据,
当然如果发送的数据超过1024就循环发送。
——————————————————————————————
不会造成接受混乱,可以这么发.


纠正我先前说的话,刚没说清楚,不是CString不能写在结构里,在结构里定义CString没有问题,可是在你的程序里,不应该定义在结构里,因为CString是定长的,只是指针和一些信息,在付值得时候动态分配内存,实际结构里没给字符串分配内存,所以发送结构的时候,其实也没把字符串发送出去.
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……