- char return_msg[50];
- ………………
- if(send(ClientSocket,dataPacket,sizeof(char)*strlen(dataPacket),0) == SOCKET_ERROR)
- {
- cout<<"Send fail!!"<<endl;
- exit(0);
- }
ANSI C 规定,int/long/double 等数据类型的长度依赖于实现,但是 char 数据类型的长度一定是 1,因此sizeof(char) * .... 就真的有点儿脱裤子放屁了。
- if(recv(ClientSocket,return_msg,sizeof(return_msg),0)== SOCKET_ERROR )
- {
- cout<<"recv fail!!"<<endl;
- exit(0);
- }
- else
- {
- return_msg[strlen(return_msg)]='/0';
- cout<<"receive:"<<return_msg<<"-----"<<endl;
- }
return_msg[strlen(return_msg)] 在不溢出的情况下,恒等于 '/0',不用再赋 '/0' 给它,看来你真的是不懂 strlen,看来你真的是不懂字符串,看来你真的是白混了。
系统只保证接收buf中recv返回的长度是有意义的,虽然整个buf都是你定义的,但buf中recv返回长度之后是什么数据,函数并不保证,即使内容是你程序的源码,也不奇怪:)
上面代码那里还存在问题?
可以明确告诉你的一点是:
strlen 在这里最多只能使用半次。
之所以说半次,是因为 send 之前的代码我没有看到,
如果符合语义的话,send 那里是可以用 strlen 的。
其它几个地方都不能使用 strlen。
为什么?因为 strlen 操作的是字符串,而不是二进制数据,语法上没问题,但是语义不符。
结果能正确才怪呢。
strlen 在这里最多只能使用半次。
之所以说半次,是因为 send 之前的代码我没有看到,
如果符合语义的话,send 那里是可以用 strlen 的。
其它几个地方都不能使用 strlen。
为什么?因为 strlen 操作的是字符串,而不是二进制数据,语法上没问题,但是语义不符。
结果能正确才怪呢。
strlen 容易产生脏数据,sizeof虽然费时间却能清空所有的空间。