<p>&nbsp;hi</p>
<p><br>I&nbsp; have been working on a project in which PC send/receive&nbsp; ethernet<br>frame to/from a FPGA board.<br>The connection via a 1 Gb switcher.</p>
<p>In order to test the limitation of the switcher,&nbsp; I send a big file<br>(about 2.6GB) from PC TO PC via the switcher by an application like<br>IM. The rate is about 30 MB/s.</p>
<p>I programmed a software based on winpcap,&nbsp; but the rate of sending<br>seems not so fast as what it is supposed to be.&nbsp;&nbsp; The rate is about<br>4MB/S.</p>
<p>In order to figure out the bottleneck,&nbsp; I made a simplest program<br>which only&nbsp; sends Ethernet&nbsp; frame in loop.&nbsp; Each frame &#39;s size is<br>about 1460 bytes.&nbsp;&nbsp; And I captured the frame by Wireshark.&nbsp; I&nbsp; noticed<br>that the&nbsp; period time between&nbsp; each frames&nbsp;&nbsp; is about 0.0002<br>
seconds.&nbsp;&nbsp;&nbsp; According to that , I can calculate the rate like :&nbsp; 1460<br>bytes/ 0.0002= 6.9 MB/S.&nbsp;&nbsp; And I runed the program on PCs&nbsp; with 100M<br>Ethernet cards&nbsp; and&nbsp; on 1G Ethernet cards. There is no difference no<br>matter that the netcard is&nbsp; 100M or&nbsp; 1G.</p>

<p>The question is how could I improve&nbsp; Is there any parameters that I<br>need to configure&nbsp; to improve the period time between the frames so<br>that I can increase the rate of sending Ethernet frame ?</p>
<p>&nbsp;</p>
<p>void CWndDown::OnBtnTst()<br>{<br>// TODO: Add your control notification handler code here</p>
<p>//<br>int iAmount= sizeof (FrameHead ) + sizeof(FrameHead2 )+1440*sizeof<br>(char);//length of the frame<br>unsigned char *pData2=new unsigned char [iAmount ];//<br>FrameHead * pfHead=(FrameHead *)pData2; //<br>FrameHead2 * pfHead2=(FrameHead2 *)( pData2+sizeof (FrameHead ));//<br>
unsigned char *pData=(unsigned char *)( pData2+sizeof (FrameHead ) +<br>sizeof(FrameHead2 ));//<br>CString tmp; //<br>unsigned char pp[6];//<br>unsigned long i;<br>//get the destination&#39;S&nbsp; MAC<br>for(i=0;i&lt;6;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp; tmp.Format(&quot;0x%c%c&quot;,m_MacAddrSel.macAddrFpgaA.GetAt(i*3),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_MacAddrSel.macAddrFpgaA.GetAt(i*3+1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pp[i]=_tcstoul(tmp,0,16);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>pfHead-&gt;DesAddr.addr0=pp[0];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;DesAddr.addr1=pp[1];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;DesAddr.addr2=pp[2];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;DesAddr.addr3=pp[3];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;DesAddr.addr4=pp[4];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;DesAddr.addr5=pp[5];</p>

<p><br>//get the SOURCE&#39;S MAC<br>for(i=0;i&lt;6;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp; tmp.Format(&quot;0x%c%c&quot;,m_MacAddrSel.macAddrPc.GetAt(i*3),<br>m_MacAddrSel.macAddrPc.GetAt(i*3+1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pp[i]=_tcstoul(tmp,0,16);//</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br>pfHead-&gt;SrcAddr.addr0=pp[0];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;SrcAddr.addr1=pp[1];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;SrcAddr.addr2=pp[2];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;SrcAddr.addr3=pp[3];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;SrcAddr.addr4=pp[4];<br>&nbsp;&nbsp;&nbsp; pfHead-&gt;SrcAddr.addr5=pp[5];</p>

<p>pfHead-&gt;FrmLgth=htons(0x002e);//</p>
<p><br>pfHead-&gt;FrmTyp=htons(FRAME_DATA);</p>
<p><br>&nbsp;&nbsp;&nbsp; pfHead2-&gt;len= 1;</p>
<p>memset(pData, 0x55, 1440);<br>pfHead2-&gt;seq=htonl(i);</p>
<p>int iLoopTime=1;</p>
<p>while(iLoopTime)<br>{<br>/* SEND PACKETS */<br>if (pcap_sendpacket(m_gadhandle,pData2, iAmount ) != 0)<br>{<br>MessageBox(&quot;\nError sending the packet: \n&quot;,&quot;ΜαΚΎ&quot;,MB_OK|<br>MB_ICONINFORMATION);<br>}<br>
}</p>
<p>delete []pData2;</p>