这次介绍另外一个选择:UDP,虽然不可靠,但是速度绝对不错。
1、标准的UDP性能
用C/C#/Java在Dell 1950/Windows 2003上,100M带宽 。
性能都差不多: 60个字节的数据,1万/秒
用多个程序来跑加起来结果也是一样。 难道Windows对UDP速度有限制?
2、RAWSocket+UDP
C#写的,性能达到了4万/秒
3、RAWSocket+IP
C写的 ,性能达到了8万/秒
5、C++代码:
网上有的家伙代码写的太差了,应该至少不该有低级错误吧。IP/UDP的头的大小计算都有错误,害人啊。
http://www.experts-exchange.com/Programming/Languages/CPP/Q_20372735.html
1. struct udpheader *udph = (struct udpheader *) (datagram + (4*4)); //4*4 有问题,应该是20
2.iph->ip_len = sizeof (struct ipheader) + sizeof (struct udpheader);// 应该加上htons
3.CheckSum可以不计算
5、C#代码:
string IpString = "192.168.1.14";
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Udp);
IPAddress remoteIp = IPAddress.Parse(IpString);
int i = 0;
//while (true)
{
string msg = string.Format(format, i++, DateTime.Now);
Byte[] b = Encoding.ASCII.GetBytes(msg);
Byte[] newB = new Byte[b.Length + 8];
b.CopyTo(newB, 8);
int src_prt = 6000;
int dest_port = 1112;
int tot_len = newB.Length;
newB[0] = (Byte)(src_prt / 256);
newB[1] = (Byte)(src_prt % 256);
newB[2] = (Byte)(dest_port / 256);
newB[3] = (Byte)(dest_port % 256);
newB[4] = (Byte)(tot_len / 256);
newB[5] = (Byte)(tot_len % 256);
newB[6] = 0;
newB[7] = 0;
s.SendTo(newB, new IPEndPoint(remoteIp, dest_port));
}