消息关闭
    暂无新消息!

c++ socket基本问题

问题作者 : 脚印jqo2017-07-11发布
struct PacketHead {
uint16_t packetSize;
uint16_t packetId;
char msg[10];
};
string aa = "abcdefg34523452345";
int allsize = sizeof(uint16_t)*2 + aa.length();
char* item = new char[allsize];
PacketHead* phead = (PacketHead*)item;
phead->packetSize = allsize - sizeof(uint16_t)*2;
phead->packetId = 1000;
strcpy(phead->msg, aa.c_str());

rc = send(s, (char*)phead, allsize, 0);

这边发送时候,aa超过10了,stcpy的msg没有这么打空间,但是对面还是全部收到信息了,请问这是为什么?谢谢

5个回答

︿ 2
因为strcpy将aa的字符串内容全部拷贝到了msg地址开头的区域,即使msg的长度定义只有10,但strcpy结束拷贝的判断是源字符串遇到'\0',然后你又将它按照aa字符串的长度发送了出去,所以那边全部收到了信息。这样做是很危险的。
︿ 0
strcpy是不安全的,拷贝函数内部是指针操作,越界会引发未知错误,当然也可能不会报错,所以不安全。请用strcpy_s,这个函数需指明缓冲长度,避免越界,是安全的。
︿ 0
感谢各位,那请问一般msg的长度如何定义,或者我这种写法就是错误的?谢谢!
︿ 0
这个其实跟socket没有关系,你应该问的是 strcpy为什么不报错, 其实你这么做已经越界了,没报错的原因是没有访问冲突,后面刚好没东西,多跑几次应该就会报错了。如果一直没报错,那说明楼主是天选之子。