socket ip地址

linux 下用socket 写一个客户端程序,如下

int fun(char* ip)

{

  host=gethostbyname(ip);
     if( host ==NULL)
    {
        herror("\ngethostbyname error:");
        return -1;
    }
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(51112);
    serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero),8);
    int ret1=connect( sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr) );


}

可以看到,这个ip是作为参数传进来的,而且这个参数是通过一个服务器返回来的ip,经过打印调试,发现ip显示是正确的,但是connect 会报错:

: No route to host

后又换成其他方式传递ip,还是报错

但是将ip写成字符串,比如ip="......"; 这样传进去,一切正常

后来,发现linux调试程序太麻烦了, 出了这样的问题,其实在运行时候,看一下内存就知道了,printf来调试,毕竟效果还是很差


于是,把程序用kdevelop 单步调试,发现问题了,通过服务器传回来的  字符串 除了ip地址外 后有若干 乱码

而写死的ip 字符串,后面没有多余的字符。


传的ip是通过 memcpy 到一个定长字符串数组来实现的

memcpy(lbi.ip,ip.c_str(),ip.length());

于是,将该字符串数组清零,再拷贝,一切正常


这个问题耗时1个半小时, 又是常识问题。

所以,在写网络程序时,记得将协议里面的char [ ] 清零后,再放数据,切记


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值