socket的问题。

s271637411 2014-11-19 10:19:10
typedef GPSData{
string IPPort;
string time;
string speed;
string Latitude;
};
TCP server端 发送一个结构体GPSData1 = {“127.0.0.1/8000”,"20141119",......};
GPSData2 = {“192.168.0.1/8001”,"20141119",......};

接收端接收到GPSData1是正常的,接收到GPSData2 = {“错误指针”,"20141119",//后面的数据正常};
这是怎么回事?
...全文
421 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Marcelxx 2014-11-27
  • 打赏
  • 举报
回复
字符串倒是发送了,但是字符串的长度呢?这些信息都没有,不要使用string来发送信息。可以在设一个字符的长度信息。
向立天 2014-11-26
  • 打赏
  • 举报
回复
引用 11 楼 s271637411 的回复:
[quote=引用 10 楼 xianglitian 的回复:] 你通信协议怎么制定的 这两个包的IP长度明显不一致啊 按着同样的规则肯定出问题啊
只是单纯发送结构体中的数据,接收端用同样的结构体接收数据。[/quote]你的消息里有可变字符串 然后还这么简单粗暴的处理 一旦字符串长度超出范围肯定出问题啊 或者你可以开一个大数组足够容纳可预期的最大字符串
「已注销」 2014-11-25
  • 打赏
  • 举报
回复
呵呵,楼主真敢干啊。 之所以能“偶然”发过去,是因为string内容的的长度 <=N 了,N在string结构内部。
「已注销」 2014-11-25
  • 打赏
  • 举报
回复
引用 12 楼 s271637411 的回复:
[quote=引用 9 楼 sinservice 的回复:] 呵呵,楼主真敢干啊。 之所以能“偶然”发过去,是因为string内容的的长度 <=N 了,N在string结构内部。
有道理,但是为什么string内容的长度超过N了发过去就出错了呢?(测试了下,string长度超过15就会出错)?[/quote] 呵呵,因为string是这么实现的, 伪代码: class string { ........ private: size_t length; char buff[16]; char *ptr; }; 你看,这个string,他把内容存在buff或者ptr里,当内容不大于16(即 15 + 1 ,1是尾符0)时,他用buff存储,大于16时,就从堆里分配一块内存来存储。 你发送了string对象,那么,如果内容长度不大于16,就可以将所有内容发过去,而大于16,你就只能发送一个“堆指针”过去了。堆指针只在你现在这个进程上有效,你把指针发送另外的进程,当然是wild pointer。
s271637411 2014-11-25
  • 打赏
  • 举报
回复
引用 9 楼 sinservice 的回复:
呵呵,楼主真敢干啊。 之所以能“偶然”发过去,是因为string内容的的长度 <=N 了,N在string结构内部。
有道理,但是为什么string内容的长度超过N了发过去就出错了呢?(测试了下,string长度超过15就会出错)?
s271637411 2014-11-25
  • 打赏
  • 举报
回复
引用 10 楼 xianglitian 的回复:
你通信协议怎么制定的 这两个包的IP长度明显不一致啊 按着同样的规则肯定出问题啊
只是单纯发送结构体中的数据,接收端用同样的结构体接收数据。
向立天 2014-11-25
  • 打赏
  • 举报
回复
你通信协议怎么制定的 这两个包的IP长度明显不一致啊 按着同样的规则肯定出问题啊
聚义舔刀 2014-11-24
  • 打赏
  • 举报
回复
可能粘包了。另外结构体不要用string。
dvlinker 2014-11-20
  • 打赏
  • 举报
回复
是粘包了?一般消息中都要携带数据长度的,TCP协议栈会根据当前的网络拥塞情况,将socket缓存中内容切成若干个包发过来的,接收端要循环接收的
阿源是少年 2014-11-20
  • 打赏
  • 举报
回复
不要用string来发送,用数组
版主大哥 2014-11-20
  • 打赏
  • 举报
回复
用string作为协议发送,这要多大啊... string是变长,为何不使用定长的数组呢?
jianghandaxue 2014-11-20
  • 打赏
  • 举报
回复
用char数组发送
oyljerry 2014-11-20
  • 打赏
  • 举报
回复
用一个char数组,用另一个变量int length来指定数组长度
s271637411 2014-11-19
  • 打赏
  • 举报
回复
引用 1 楼 fengswd 的回复:
重复接受的时候,每接受完一次,清除接受buffer,然后再接受下一次。否则出现很多莫名其妙的错误
我接收的时候用的是结构体数组。接收之前也清空过,结果还是这样
fengswd 2014-11-19
  • 打赏
  • 举报
回复
重复接受的时候,每接受完一次,清除接受buffer,然后再接受下一次。否则出现很多莫名其妙的错误

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧