目录
这个标题有点乱哈。其实都是源于测试以太网一秒发送数据的速率。分为三个部分写吧,一是在Linux下实现一秒的定时功能,二是编写C程序实现测试以太网的网速,三是关于socket中recv函数的不足。二三可以归为一块。
在这之前还是推荐一部电影棒子国的《我的一级兄弟》,讲的是一个智商停留在六岁的弟弟和身体残疾的哥哥相依为伴的故事。
先说一下,我没有实现,大佬们可以指点一下。真是,敲了这么多年代码,这个写不出来。我原本使用的sleep这个函数,但是没有仔细看这个函数说明,它会把当前的进程挂起,参数时间后继续执行。所以这就不符合我的要求,我要实现发送一秒的数据,要干一秒的事情,进程挂起我怎么做事情?想起在裸机开发中常用到的delay函数,但是好像在Linux下的C库中没法用,具体我也忘了,效果不太好或者没有实现。
我找了很多方法,也有用time函数系列,思路就是获取当前系统时间,运行一段时间后再获取一次时间,两值相减==1即为一秒。但是这样做极不精确。接着我尝试了一下alarm函数,发现什么,单独的程序可以执行,但是我加入socket连接之后,不会执行alarm的信号signal。我说的很乱,总之最后都没有我想要的答案。
后来有这样一个思路,我手动计时,看着秒表来,手动连接以太网运行程序,手动关掉,这中间看一共发送了多少字节,用时间除得出来速率。如果你觉得不精确,继续往下看。
上面的手动岂不是更不精确。进而优化,服务器这边开始接收字节时打印出时间(我的场景就是Ubuntu是客户端,mp1是服务器,我用到了usart输出时间),这样用到了串口工具上面的时间戳,这个还是比较精确地,ms级别。
从而,统计出发送的字节和时间得出速率。
上面说了,Ubuntu(64位)和mp1(32位)通信,我不知道是不是缓冲区大小的问题,会出现这么一个情况,Ubuntu当做客户端使用send函数一次发送20000字节数据。
int n = send(socket,buf,20000,0);
然后服务器
int n = recv(socket,buf,20000,0);
就会出现什么情况,recv一次并不能接收到20000,试了几次都是14480。查了一下这个函数的详细,发现什么,这第三个参数的设置,并不意味着就可以收到那么多,而是最多收那么多,这只是一个最大值限制,至于接收多少要看很多情况,就比如我现在这种情况,Ubuntu和板子,不知道是不是位数的不同,还会因为tcp的协议等等。很多情况。所以解决办法是什么,while,一直接收,直到recv返回值为零结束recv。
其实我写这些也有很多疑问,比如既然Ubuntu可以一次发送这么多字节,那么他send的最大值是多少呢?我记得socket的缓冲区大小是可以修改的,不知道和这个有没有关系。
。。。。。。
一直在学习的路上。