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 [ ] 清零后,再放数据,切记