【C_socket】select和多线程的一些BUG
[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代表目前无新连接建立。
还有因为把条件判断语句中的”==”写成”=”,导致套接字重复关闭。
此文章版权归秦政所有,如有转载,请注明來自原作者
Comment