socket 编程及相关的点评

 
  1. char return_msg[50];
  2. ………………
  3. if(send(ClientSocket,dataPacket,sizeof(char)*strlen(dataPacket),0) == SOCKET_ERROR)
  4. {                                                                
  5. cout<<"Send fail!!"<<endl;        
  6. exit(0);
  7. }
ANSI C 规定,int/long/double 等数据类型的长度依赖于实现,但是 char 数据类型的长度一定是 1,因此sizeof(char) * .... 就真的有点儿脱裤子放屁了。

  1. if(recv(ClientSocket,return_msg,sizeof(return_msg),0)== SOCKET_ERROR )
  2. {
  3. cout<<"recv fail!!"<<endl;
  4. exit(0);
  5. }
  6. else
  7. {        
  8. return_msg[strlen(return_msg)]='/0';
  9. cout<<"receive:"<<return_msg<<"-----"<<endl;                
  10. }
return_msg[strlen(return_msg)] 在不溢出的情况下,恒等于 '/0',不用再赋 '/0' 给它,看来你真的是不懂 strlen,看来你真的是不懂字符串,看来你真的是白混了。

recv接收不正常?
系统只保证接收buf中recv返回的长度是有意义的,虽然整个buf都是你定义的,但buf中recv返回长度之后是什么数据,函数并不保证,即使内容是你程序的源码,也不奇怪:)


上面代码那里还存在问题?
可以明确告诉你的一点是:
strlen 在这里最多只能使用半次。
之所以说半次,是因为 send 之前的代码我没有看到,
如果符合语义的话,send 那里是可以用 strlen 的。
其它几个地方都不能使用 strlen。
为什么?因为 strlen 操作的是字符串,而不是二进制数据,语法上没问题,但是语义不符。
结果能正确才怪呢。
strlen 容易产生脏数据,sizeof虽然费时间却能清空所有的空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值