[toc]

本人博客https://qinzheng7575.github.io/

前言

之前的项目,已经能够很好的实现socket的一些基础操作,但是距离一个真正的通信类应用程序还是差距很多,在接下来的项目3、4中,依然遇到了很多问题,有些是因为粗心,而有些则是因为对函数和套接字的理解还不够,接下来就按照问题复盘的形式,重新看一看自己遇到的问题

文件操作错误

错误内容:

”段错误(核心已转储)“core dumped

原因:

文件读取的时候,feof和fread一起使用可能会导致错误,因为二者判断文件文件结尾有所不同。

用fread的返回值进行判断是否结束,因为feof是文件指针真正到达文件末尾后才返回-1,所以同样已函数返回结果作为循环判断结束依据的话,feof会比fread多一次循环。

fread是成段成段的读取,即便文件指针还没到末尾,但如果读取的段到了文件末尾,就返回0,而文件指针经过这次读取后才到达文件末尾。

解决方法:

==最后选择了根据fread的返回值判断是否结束,而没有采用feof。==

错误内容

文件读写完fclose时指针发生异常

原因:

fread会改变文件指针(Fid)的位置,导致fclose(Fid)时出现段错误。

解决方法:

新建文件指针存储文件起始处的Fid,然后fclose该指针

对select后的判断分支出错导致死循环

accept函数是阻塞的,当socket 设置为非阻塞时,就会返回错误-1值,在主套接字上,对返回值进行判断处理,-1代表目前无新连接建立。

还有因为把条件判断语句中的”==”写成”=”,导致套接字重复关闭。