socket超级疑难? 本帖最后由 VisualEleven 于 2011-03-02 13:05:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 字节对齐 编译器已经给你考虑了! 来 上代码! 或者有没有可能其他地方影响到了。我以前也遇到过,后来单独把SOCKET 提取出一个模块就好了。结构体都是乱码 本帖最后由 VisualEleven 于 2011-03-02 13:34:07 编辑 本帖最后由 VisualEleven 于 2011-03-02 13:35:41 编辑 你这个结构体里面都还有什么CString之类的东西。。你不妨自己定义包协议吧,只要收发两边协议一致,随便怎么发都可以的。。 MESSAGE_INFO(); 消息信息?函数? 不懂对 改成 char[] CString 在结构体中,这样的结构体也可以这样发送??CString是变长的,可以改成固定长度的字符数组。 按照上述所述:我改为下面这样的定义:其中ACTION_TYPE是一个enum,应该没什么问题吧struct MESSAGE_INFO { public: ACTION_TYPE MSGTYPE; char MetaData[3]; char ID[3]; time_t Time; int PackageIndex; int PackageCount; int DataLen; char Data[3]; char DownFileName[3];}; 这其实就是网络字节序的问题,你的结构体是以二进制的方式发送出去的,你将接收到的结构体memcpy到相同的结构体中,然后用ntohl转化那些定义为int型的变量 把CString的那个家伙替换掉,你那样sizeof会不正确的! 1、字节序对齐。2、int类型的,要做字节序转换3、如果结构体有指针的话,不要整个结构体发送过去,发过去也没有用。该为数组吧另外,要考虑socket粘包问题,给个接收端的参考代码:int rcvLen = sizeof(MESSAGE_INFO);while(rcvLen > 0) //保证接收一个完整的数据包{ ln_len = recv(*clientInfo->pSocket, ls_rcvBuffer + sizeof(MESSAGE_INFO) - rcvLen, rcvLen, 0); if(ln_len < 0) { //错误处理 } rcvLen -= ln_len;}MESSAGE_INFO lo_msg;lo_msg = *(MESSAGE_INFO*)&ls_rcvBuffer; send端也要保证整个结构体都完全发送。另外,你可以考虑学习下阻塞/非阻塞的问题。 楼上的:ln_len = recv(*clientInfo->pSocket, ls_rcvBuffer + sizeof(MESSAGE_INFO) - rcvLen, rcvLen, 0); 写错了吧 写XML文件问题_初次接触 求助:VC.NET2003中使用mschart控件的问题! 0 对话框上面能不能再显示两个对话框?我在对话框CDialog上面设置了两个picture控件,想在这两个pictrue上面显示分别显示CPropertySheet 和CD 高手请看!有人做过音频频谱分析没有?分不够再加 请问应该如何使用CreateProcess启动一个控制台程序? 找资料,MMS(多媒体消息服务)协议,来者有分!!!! 怎么设置控件的字体? 笨笨的我,傻傻的笑,dll高手快来到 如何在linux上安装oracle9i,很急!帮帮我这个菜鸟吧! 我的msdn打不载,为什么? 网络传输的编码问题。 如何判断我的程序已经运行了,就不需要再开启一个程序了
你不妨自己定义包协议吧,只要收发两边协议一致,随便怎么发都可以的。。
其中ACTION_TYPE是一个enum,应该没什么问题吧struct MESSAGE_INFO
{
public:
ACTION_TYPE MSGTYPE;
char MetaData[3];
char ID[3];
time_t Time;
int PackageIndex;
int PackageCount;
int DataLen;
char Data[3];
char DownFileName[3];};
2、int类型的,要做字节序转换
3、如果结构体有指针的话,不要整个结构体发送过去,发过去也没有用。该为数组吧另外,要考虑socket粘包问题,给个接收端的参考代码:
int rcvLen = sizeof(MESSAGE_INFO);
while(rcvLen > 0) //保证接收一个完整的数据包
{
ln_len = recv(*clientInfo->pSocket, ls_rcvBuffer + sizeof(MESSAGE_INFO) - rcvLen, rcvLen, 0);
if(ln_len < 0)
{
//错误处理
}
rcvLen -= ln_len;
}MESSAGE_INFO lo_msg;
lo_msg = *(MESSAGE_INFO*)&ls_rcvBuffer;
send端也要保证整个结构体都完全发送。
另外,你可以考虑学习下阻塞/非阻塞的问题。
ln_len = recv(*clientInfo->pSocket, ls_rcvBuffer + sizeof(MESSAGE_INFO) - rcvLen, rcvLen, 0);
写错了吧