今天的学习

 在学习了UNIX网络编程前七章后,今天写了一个非常简单的C/S模型程序,客户端发送文件到服务器,服务器端统计文件中数字的个数,然后把统计结果送回客户端显示。虽然很简单,但是由于不经常写程序,写的过程中遇到了一些困难,犯了很多错。

   首先,这个程序,只有在客户端发送文件完毕,服务器端才能返回文件中数字的个数,那么这里存在一个问题,就是怎样通知服务器端文件已经发送完了。最先想到的是客户端在发送完文件的时候调用shutdown函数,半关闭TCP链接,那么服务器端就能通过检测客户端发送的FIN,来判断是否客户端已经发送完文件,想法不错,但是很难实现,因为检测FIN这种数据包,不是应用层的事情。最终作罢,选择另外一个思路,在客户发送完文件的时候,额外发送一个字符串“END”,服务器端通过检测“END”来判断是否已经收到所有的数据。字符串的检测刚开始用的是buffer=“END”,但是C语言里有更好的函数strcmp(buffer,"END")。在这里有一个不理解的地方,是不是每send一次数据,TCP就发送一次send的数据,简单来说,最后发送的“END”,有没有可能是和以前send在缓冲区中的数据一块送过去的,如果存在这种可能的话,程序就可能检测不到最后发送的“END”,因为“END”和其他数据混在一块儿。推广开,我们能否控制TCP链接每次发送数据包的内容,不能添加也不能减少!!!

   其次,用到了atoi和itoa两个函数,可以实现字符串和数字之间的转换,不过linux默认只有atoi函数,itoa的功能用sprintf函数来实现,sprintf(str,"%d",count),count是整数,str是字符串,这个函数把整形数count转换成字符串str。

   然后,C语言中fopen函数用来打开文件,第一个参数为文件名,第二个为访问控制参数,返回值为文件指针。当要打开的文件不存在时,访问控制参数w和w+可以创建该文件,并且打开,但是这种情况下,不能在访问控制参数中添加r,如果加入r,会出现no such file or directory的错误。

   最后,注意区分服务器端的监听socket和已链接socket,他们各自的作用不同!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值