基于udp的丢包率统计

ID_HAPPY 2009-04-13 02:08:11
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
void main()
{
SOCKET socket1;
InitWinsock();
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(1000); ///监听端口
local.sin_addr.s_addr=INADDR_ANY; ///本机

socket1=socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)&local,sizeof local);
while (1)
{
char buffer[1024]="\0";
printf("waiting for message from others-------------\n");
if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
{
printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
////给cilent发信息
sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);

}
Sleep(500);
}
closesocket(socket1);
}

对于这样一段程序,是UDPserver程序,我想请教各位点问题啊!
第一个:就是这个InitWinsock();运行总说没定义,是不是我没包含什么头文件啊!
第二个:我如果想统计丢包率,肯定要发送一定数量N的数据包,我如何发送呢!我的编程思路大致如下,利用程序A发送100个数据包到程序B,统计程序B接收到的数据包,就可以计算出丢包率,我现在对包的概念还不是很懂!例如我写一段字符“我是。。”发送出去,这是代表多少个数据包呢?我如何发送100个数据包呢?只是知道通过循环实现
第三个:我想控制发送速度,如何控制呢!
如果可能给在程序上帮我改改吧,能做一个给我最好,我的邮箱caopeipei_only1@163.com!万分感谢,如果不行,您能给我解释下我不懂得,我也同样感谢
...全文
2163 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengtu224 2012-10-16
  • 打赏
  • 举报
回复
新人不会统计求指导
bragi523 2009-04-13
  • 打赏
  • 举报
回复
达人们都来了
基本上已经解释清楚了
对于第二问我觉得楼主该看看书了
第三问,我用过sleep做过
一般是这样,你想要控制什么速度,发多少就sleep掉应该占用的时间
  • 打赏
  • 举报
回复
第一个:就是这个InitWinsock();运行总说没定义,是不是我没包含什么头文件啊!
第二个:我如果想统计丢包率,肯定要发送一定数量N的数据包,我如何发送呢!我的编程思路大致如下,利用程序A发送100个数据包到程序B,统计程序B接收到的数据包,就可以计算出丢包率,我现在对包的概念还不是很懂!例如我写一段字符“我是。。”发送出去,这是代表多少个数据包呢?我如何发送100个数据包呢?只是知道通过循环实现
第三个:我想控制发送速度,如何控制呢!
如果可能给在程序上帮我改改吧,能做一个给我最好,我的邮箱caopeipei_only1@163.com!万分感谢,如果不行,您能给我解释下我不懂得,我也同样感谢

1:要调用WSAStartup来初始化WS2_32.DLL
2:“我是。。”这段数据是在包的data段里.如果是UDP包,就是以太头,ip头,UDp头->再是数据(“我是。。”),你对协议不了解,就先看看协议.判断丢包率,其实通sendto 的返回成功与否就可以统计了.

3:控制速率,考虑用个timer来处理吧
dinona 2009-04-13
  • 打赏
  • 举报
回复
数据包的大小是由你自己定的,而要发送100个数据包的意思也就是叫你
循环发送100次,然后平均一下来判断丢包率^
要定时发送就要开两个线程了,一个用来接收,一个用来发送
原因是sendto和recvfrom是阻塞的,
按你的定时实际上是:recvfrom阻塞等待数据到来时间+recvfrom接收数据总时间+Sleep(500);
dinona 2009-04-13
  • 打赏
  • 举报
回复
bool InitWinsock()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return false;
}

/* Confirm that the WinSock DLL supports 2.2. */
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup();
return false;
}

return true;
}
oyljerry 2009-04-13
  • 打赏
  • 举报
回复
1.InitWinsock是代码的自定义函数,估计是进行socket初始化的工作,你可以自己实现,WSAStartup等
2.sendto的返回值来判断
3.循环sendto中用Sleep等控制发送速率
cnzdgs 2009-04-13
  • 打赏
  • 举报
回复
1、用WSAStartup,MSDN中有例子。
2、调用一次sendto函数,如果成功,就会发送一个包;每个包必须小于64KB。
3、用定时或者Sleep。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧