万兆网络UDP速率传输性能测试(接受端)

接受端是在VS2010下开发的控制台程序,接受采取的是多线程去接收,VS2010不自带pthread库,这个库是Linux下线程操作库,习惯了在Linux下开发,就把这个库文件安装到VS的安装目录。


线程库下载地址:pthreads-w32-2-8-0-release.zip 

控制台程序exe文件(采用的是静态编译,只有一个exe文件,方便操作),下载地址:udpserver.exe

exe界面效果如下:



控制台exe 包解压后有两个文件  分别是run_server.bat和udpserver.exe   ,因为udpserver.exe是控制台程序,你直接打开会闪退,也可在控制台cmd命令里面去执行这个控制台程序,这样避免闪退,但是比较麻烦,这里提供一个run_server.bat脚本程序,直接运行这个udpserver.exe控制台程序,run_server.bat文本如下:

rem *.exe  <Port >  <ONCE_SIZE><Client_Thread_Nums><Self_Thread_Nums>     /* 是注释 */
udpserver.exe 8888 61440 1  3
pause   /* 启动完后暂停   方便看控制台打印程序 */


安装线程库:解压pthreads-w32-2-8-0-release.zip 后,执行exe文件,在Browse里面选择安装目录,然后点击Extract,Done。   安装完成后把安装目录下的Pre-built.2目录下面的include  lib分别拷贝到VS安装目录,VC目录下面的 include  lib  。同时需要把pthreadVC2.dll拷贝到操作系统目录,及C:\WINDOWS\system32下面  不然运行exe会提示找不到pthreadVC2.dll这个库文件。


udp_server.cpp

#include "stdafx.h"

#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <string.h>
#include <semaphore.h>
#include <pthread.h>
#include <sched.h>
#include <stdlib.h>


using   namespace   std;

#define Maxlen 65535


char buffer[Maxlen];
#pragma comment(lib,"ws2_32.lib") 
#pragma comment(lib,"pthreadVC2.lib")

static int count;

struct Socket_Pagram
{
	int SockFd;
	int Thread_Num;
	int One_Frame_Size;
	int  Recevie_Frame_Num;
	int Client_Thread_Nums;
	int Server_Thread_Nums;
	double TimeTotal;
	pthread_t   Pthread_Id;
};

struct Socket_Pagram *Pagram;

pthread_mutex_t  work_mutex;

void SocketInit()
{
	WSADATA wsaData;
	WORD version=MAKEWORD(2,0);
	int ret=WSAStartup(version,&wsaData);
	if(ret!=0)
		printf("初始化失败");
}


void CloseSocket()
{
	if(WSACleanup()!=0)
		printf("clean失败");
}

void * RecevieData(void *arg)
{
	struct Socket_Pagram *ptr = (struct Socket_Pagram *)arg;
	char *buff = "send is complete";
	char buffer[65535] ;

	struct sockaddr_in cliaddr;
	LPSOCKADDR Client_Addr = (LPSOCKADDR)&cliaddr;
	int len = sizeof(cliaddr);

	unsigned long AllByteSize = (ptr->Client_Thread_Nums*ptr->One_Frame_Size);

	 int i,ret;
	 long long count=0;

	ret = pthread_mutex_init(&work_mutex,NULL);

	while(1)
	{
		if((count=recvfrom(ptr->SockFd,buffer,sizeof(buffer),0,Client_Addr,&len))>=20)
		{
			ptr->Recevie_Frame_Num++;	
			printf("thread %d  accept Frame size :%d\n",ptr->Thread_Num,ptr->Recevie_Frame_Num);
		}
	
		else
		{
			printf("thread %d accept is complete!\n",ptr->Thread_Num);
			break;
		}


	}
return NULL;
}


void print_usage(char *file)
{
	printf("Usage:\n");
	printf("%s   <Port >  <ONCE_SIZE><Client_Thread_Nums><Self_Thread_Nums>\n", file);
}

int main(int argc,char *argv[])
{
	int sockfd,i,ret;
	struct sockaddr_in servaddr;

	float lost_pack = 0;

	int Port,SIZE,Clien_Thread_Num,Self_Thread_Nums;

	int All_Frame = 0;

	if (argc != 5) 
	{
		print_usage(argv[0]);
		return -1;
	}

	Port                                = strtoul(argv[1], NULL, 0);
	SIZE   				 = strtoul(argv[2], NULL, 0);
	Clien_Thread_Num         = strtoul(argv[3], NULL, 0);
	Self_Thread_Nums          = strtoul(argv[4], NULL, 0);

	Pagram = (struct Socket_Pagram *)malloc(Self_Thread_Nums*sizeof(struct Socket_Pagram));

	SocketInit();

	if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
	{
		printf("socket failed");
		CloseSocket();
		return 0;
	}

	memset(&servaddr,0,sizeof(servaddr));
	servaddr.sin_family=AF_INET;
	servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
	servaddr.sin_port=htons(Port);

	if(bind(sockfd,(LPSOCKADDR)&servaddr,sizeof(servaddr))!=0)
	{
		printf("bind error");
		CloseSocket();
		return 0;
	}
	
	int flag = (32*1024*1024);
	setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,(char *)&flag,sizeof(flag));
	
	for(i=0;i<Self_Thread_Nums;i++){
		Pagram[i].One_Frame_Size          = SIZE;
		Pagram[i].Client_Thread_Nums    = Clien_Thread_Num;
		Pagram[i].Server_Thread_Nums   = Self_Thread_Nums;
		Pagram[i].Pthread_Id   ;
		Pagram[i].Recevie_Frame_Num	= 0;                 
		Pagram[i].SockFd           		= sockfd;
		Pagram[i].TimeTotal       		= 0;
		Pagram[i].Thread_Num	          		= i+1;
		}

	for(i=0;i<Self_Thread_Nums;i++){
	ret=pthread_create(&Pagram[i].Pthread_Id,NULL,RecevieData,&Pagram[i]);
	if(ret)
	{
		printf("create pthread %d error!\n",Pagram[i].Thread_Num);
		return -1; 
	}

	}

	printf("服务器开启......\n");


	for(i=0;i<Self_Thread_Nums;i++){
		pthread_join(Pagram[i].Pthread_Id,NULL);
	}

	for(i=0;i<Self_Thread_Nums;i++){
		All_Frame += Pagram[i].Recevie_Frame_Num;
	}

	printf("accept frame :%d\n",All_Frame);
	if((closesocket(sockfd))==SOCKET_ERROR)
	{
		printf("close error");
		CloseSocket();
		return 0;
	}

	CloseSocket();
	return 0;
}



                                                                                By Design :Linux_Google

FPGA(Field-Programmable Gate Array)是一种集成电路器件,在设计、开发和实现各种数字逻辑电路方面具有高度的灵活性和可重构性。UDP(User Datagram Protocol)是一种无连接的传输协议,适用于需要快速传输数据而无需确认接收的应用场景。万兆网指的是以太网的速率达到了10Gbps。 结合以上概念,FPGA可以用于实现UDP万兆网,即使用FPGA作为硬件平台来实现10Gbps速率下的UDP通信。由于FPGA的可重构特性,可以根据实际需求来设计和调整FPGA中的逻辑电路,以适应不同的应用场景和数据处理要求。 在实现UDP万兆网的过程中,首先需要在FPGA上搭建一个网络通信模块。这个模块主要包括FPGA与以太网物理层之间的接口,以及UDP协议栈的实现。接口通过物理层芯片将FPGA与网络连接起来,以支持数据的收发。而UDP协议栈的实现主要包括UDP报文的封装和解析、数据的发送和接收等功能。 在FPGA中实现UDP万兆网的好处在于,FPGA的高度可编程性和并行处理能力可以提高数据处理速度和通信效率。同时,FPGA的可重构性还可以满足不同需求下的灵活性,可以根据需要对硬件进行调整和优化。此外,FPGA可以与其他外设(如存储器、处理器等)相结合,构建更加强大和复杂的系统。 总之,通过使用FPGA来实现UDP万兆网,可实现高速率数据传输和无连接的通信,同时还具备灵活性和可重构性。这对于需要高速数据处理和通信的应用场景,如高性能计算、网络交换、网络加速等领域具有重要的意义。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HeroKern

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值