这学期开了一门unix网络编程,对于很多人来说貌似比较头痛,还好,我上学期有认真学习了unix环境高级编程,基础的一点东西还是懂的。
但是在编写TCP消息传递时遇到两点问题。
问题一:
read 和 write函数的第二个参数(buf)是char* 格式,而我所用的字符串是通过string类的c_str()方法转换过来的,是const char* 格式,用后者给前者赋值时是不能通过编译的,
网上查了一下,原因是char* 所指的字符 是可以更改的,而const char* 所指的字符不能更改(这个地球人都知道。。。),如果能够把const char*赋给char*,那么通过char*就可以更改const char*所指的内容,const char* 这样的申明就显得毫无用处了。因此在实现c++编译器的时候,将 const T * 赋值给 T*(T为某种基础类型)的情形定义为逻辑上的错误。
对比const char 为 char 赋值,这样是可行的,因为这里的赋值是值赋值,更改char不会影响const char 的内容。 const char*为char*赋值时不可行的,因为这里是用地址为地址赋值,更改char* 的内容就等同于更改 const char*的内容。
另外,从这个观点来看,用char* 来初始化 const char* 理论上是可以的。
问题二:
由于const char*不能给char*赋值,于是乎我就自己编写了一个小小的函数,初始化一个长度为 const char*所指变量长度的char*变量,用一个for循环来挨个赋值,
最后在传值的时候,客户端接收到的信息始终都是“正确字符串+一对乱七八糟的东西”。想了半天,原来for循环的时候光忙着拷贝值,忘了 char*格式的字符串实际上是一个
char数组,最后必须以'\0'来结束,由于缺少了这个标志,write函数将char地址后边的一对不知为何物的东西当做字符串的内容一同传给了客户端。
解决方法:
1.将char申明为const char*长度加1的数组,最后手动加上'\0'。
2.使用strcpy(郁闷,当时咋就没想到。。。)
3.使用strcat(这个没有试过,貌似不得行,,同学们自己回去试试吧)
4.使用strdup(这个也没试过~)