read,write等函数使用小方法:
在socket编程学习过程中,在服务器端和客户端互相通信时,需要用到read和write等关于文件读写的函数。直接使用这些函数时,很可能在函数出错时,对于程序执行的结果一脸懵逼,并不知道哪里出了错误,如果代码很少,还可以一行一行分析,如果代码太多,这种方法并不可行。于是我们在使用这些带有返回值的函数时,最好使用if语句判断函数是否出错:
socket编程客户端部分代码:
如果if(write(sockfd, MSG_STR, strlen(MSG_STR))<0) //将MSG_STR的内容写给服务器,端通过判断write函数返回值确定是否成功执行
{
printf("write to server failure:%s\n",strerror(errno));//如果函数出错打印出错信息
return -1;
}
memset(buf, 0, sizeof(buf)); //定义一个buf存放数据
if((read_back = read(sockfd, buf, sizeof(buf)))<0) //通过判断read返回值确定函数是否成功执行,read返回值为实际读到的字节数,出错则为-1;
{
printf("read data faliure:%s\n",strerror(errno));//打印出错信息
return -2;
}
else if(read_back == 0) //read返回值为0说明客户端与服务器端断开了连接
{
printf("server disconnected \n"); //断开连接
return -3;
}
printf("read %d bytes data form server:s\n",read_back,buf);//如果成功进行了写读操作,打印出从服务器端收到的信息
成功执行后:
但是我碰到了这样的错误:
条件语句容易忽略的小错误:
经过一步步分析后我终于找到了错误的原因:
在上面代码中 if((read_back = read(sockfd, buf, sizeof(buf)))<0)
这一句少了一个括号写成了 if(read_back = read(sockfd, buf, sizeof(buf))<0)
编译器编译时,并没有语法错误所以未报错,但程序并没有成功执行,这是因为<的优先级高于=,先进行<运算,然后将得到的结果(为0)赋值给,read_back;所以read_back=0,在else if语句中执行,打印断开连接信息。
所以我们在写if条件语句中的判断条件时,一定要注意不同运算符的优先级,根据需要添加相应的括号;
除此以外,我们还可能还会遇到这种让人哭笑不得的问题:
注意检查if,whlie等语句后面有没有因为思维惯性多加一个;哟!