UDP Socket接收大量数据异常

偶尔e网事 2013-06-26 03:38:28
新手一枚,最近做一个从安卓摄像头传输实时图像到PC端。
安卓方面用UDP传输,采用图片的方式一帧一帧传输,安卓端发送数据包是大概每隔200ms一次,每次大概10KB左右。
PC端采用如下方式接收。
while(true)
{
int i=0;
result = recvfrom(socket,recvBuff,sizeof(recvBuff),0,(sockaddr*)&(pThis->sockFrom),&len); //接收数据,recvbuff开了50000字节
if(SOCKET_ERROR == result)
{
break;
}
pThis->dbg_timeaft=GetTickCount();
DWORD deltaRecv=pThis->dbg_timeaft-pThis->dbg_timepre;
pThis->dbg_timepre=pThis->dbg_timeaft;
CString str;
str.Format("delta=%d\n",deltaRecv);//打印时间间隔
TRACE(str);
memcpy_s(tempBuff,sizeof(recvBuff),recvBuff,result);
//pThis->ImageFromStream((BYTE*)tempBuff,result);
pThis->m_handleData.data=(BYTE*)tempBuff;
pThis->m_handleData.size=result;
::PostMessage(hWnd,WM_RECVDATA,0,LPARAM(&(pThis->m_handleData))); //把WM_RECVDATA消息压入window消息队列,这里丢数据出去处理为图像
memset(recvBuff,0,sizeof(recvBuff)); //memset函数用于初始化buffer区
}

TRACE出的结果如下:
delta=31
delta=16
delta=15
delta=0
delta=16
delta=1156
delta=16
delta=15
delta=16
delta=609
delta=94
delta=1110
delta=46
delta=1891
delta=47
delta=16
delta=15
delta=16

用wireshark抓包,也是发现每隔7个包左右就会出现1~3s的时间内什么都收不到。而且这7个包之间的间隔3ms左右。不是像安卓端均匀的200ms。不知道怎么回事。
请大侠们帮忙看下。感谢~
...全文
1025 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
偶尔e网事 2013-06-29
  • 打赏
  • 举报
回复
再顶顶!!!
wwwspider001 2013-06-29
  • 打赏
  • 举报
回复
思路不正确,再折腾效果也不会好到哪去 如果觉得终端不同, 发送图像大小频率会不同, 在发送前直接向服务器提交一下参数 服务器根据提交的参数 再设置对应的缓冲/帧速之类的就ok了 公共网络的东西纠结于精准时间是得不出结果的 如果是专用网络还可以考虑一下
偶尔e网事 2013-06-28
  • 打赏
  • 举报
回复
引用 23 楼 shootingstars 的回复:
使用Wireshark看看数据传输过去了吗?
传过去了,PC端也都收到了。如上log。数据都是完整的,只是时间间隔问题。
shootingstars 2013-06-27
  • 打赏
  • 举报
回复
引用 17 楼 jackyvincefu 的回复:
[quote=引用 14 楼 shootingstars 的回复:] [quote=引用 11 楼 jackyvincefu 的回复:] [quote=引用 7 楼 shootingstars 的回复:] 如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
嗯,我用调试助手看也是这样,看起来跟PC端软件没什么关系,但是就是奇怪为什么会出现这种现象,看PC端软件有没有办法克服。 Android端Thread的Run函数代码如下:
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(port);
		           //创建一个InetAddree
		        InetAddress serverAddress = InetAddress.getByName(ipname);
		        byte data [] =myoutputstream.toByteArray();  //这是要传输的数据
		           //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号   
		        DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,port);
		           //调用socket对象的send方法,发送数据
		           socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           Log.v("deltaSend",Long.toString(deltasend));//打印时间间隔
		           timepre=timeaft;
		           socket.close();
			} catch (Exception e) {
				// TODO: handle exception	
				e.printStackTrace();
			}
			
		}
打印出的时间间隔均匀200ms左右。[/quote] 你的Android的输出正常吗?[/quote] 这是Android端发送的Log,贴一部分出来,最后一项是与上一次发送的时间间隔
06-27 09:22:49.010: V/deltaSend(1942): 151
06-27 09:22:49.190: V/deltaSend(1942): 176
06-27 09:22:49.420: V/deltaSend(1942): 230
06-27 09:22:49.560: V/deltaSend(1942): 142
06-27 09:22:49.700: V/deltaSend(1942): 137
06-27 09:22:49.880: V/deltaSend(1942): 186
06-27 09:22:50.030: V/deltaSend(1942): 152
06-27 09:22:50.170: V/deltaSend(1942): 136
06-27 09:22:50.310: V/deltaSend(1942): 134
06-27 09:22:50.440: V/deltaSend(1942): 137
06-27 09:22:50.570: V/deltaSend(1942): 130
06-27 09:22:50.710: V/deltaSend(1942): 136
06-27 09:22:50.840: V/deltaSend(1942): 136
06-27 09:22:50.980: V/deltaSend(1942): 132
06-27 09:22:51.110: V/deltaSend(1942): 138
06-27 09:22:51.280: V/deltaSend(1942): 167
06-27 09:22:51.420: V/deltaSend(1942): 138
06-27 09:22:51.610: V/deltaSend(1942): 190
06-27 09:22:51.750: V/deltaSend(1942): 137
06-27 09:22:51.880: V/deltaSend(1942): 135
06-27 09:22:52.040: V/deltaSend(1942): 155
06-27 09:22:52.190: V/deltaSend(1942): 154
06-27 09:22:52.360: V/deltaSend(1942): 166
06-27 09:22:52.490: V/deltaSend(1942): 137
06-27 09:22:52.640: V/deltaSend(1942): 144
06-27 09:22:52.810: V/deltaSend(1942): 171
06-27 09:22:53.050: V/deltaSend(1942): 238
06-27 09:22:53.210: V/deltaSend(1942): 166
06-27 09:22:53.350: V/deltaSend(1942): 135
06-27 09:22:53.500: V/deltaSend(1942): 151
06-27 09:22:53.650: V/deltaSend(1942): 155
06-27 09:22:53.920: V/deltaSend(1942): 272
06-27 09:22:54.120: V/deltaSend(1942): 197
06-27 09:22:54.290: V/deltaSend(1942): 165
06-27 09:22:54.440: V/deltaSend(1942): 151
06-27 09:22:54.590: V/deltaSend(1942): 149
06-27 09:22:54.730: V/deltaSend(1942): 147
06-27 09:22:54.890: V/deltaSend(1942): 154
[/quote] 再打印一下发送数据大小
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 14 楼 shootingstars 的回复:
[quote=引用 11 楼 jackyvincefu 的回复:] [quote=引用 7 楼 shootingstars 的回复:] 如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
嗯,我用调试助手看也是这样,看起来跟PC端软件没什么关系,但是就是奇怪为什么会出现这种现象,看PC端软件有没有办法克服。 Android端Thread的Run函数代码如下:
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(port);
		           //创建一个InetAddree
		        InetAddress serverAddress = InetAddress.getByName(ipname);
		        byte data [] =myoutputstream.toByteArray();  //这是要传输的数据
		           //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号   
		        DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,port);
		           //调用socket对象的send方法,发送数据
		           socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           Log.v("deltaSend",Long.toString(deltasend));//打印时间间隔
		           timepre=timeaft;
		           socket.close();
			} catch (Exception e) {
				// TODO: handle exception	
				e.printStackTrace();
			}
			
		}
打印出的时间间隔均匀200ms左右。[/quote] 你的Android的输出正常吗?[/quote] 这是Android端发送的Log,贴一部分出来,最后一项是与上一次发送的时间间隔
06-27 09:22:49.010: V/deltaSend(1942): 151
06-27 09:22:49.190: V/deltaSend(1942): 176
06-27 09:22:49.420: V/deltaSend(1942): 230
06-27 09:22:49.560: V/deltaSend(1942): 142
06-27 09:22:49.700: V/deltaSend(1942): 137
06-27 09:22:49.880: V/deltaSend(1942): 186
06-27 09:22:50.030: V/deltaSend(1942): 152
06-27 09:22:50.170: V/deltaSend(1942): 136
06-27 09:22:50.310: V/deltaSend(1942): 134
06-27 09:22:50.440: V/deltaSend(1942): 137
06-27 09:22:50.570: V/deltaSend(1942): 130
06-27 09:22:50.710: V/deltaSend(1942): 136
06-27 09:22:50.840: V/deltaSend(1942): 136
06-27 09:22:50.980: V/deltaSend(1942): 132
06-27 09:22:51.110: V/deltaSend(1942): 138
06-27 09:22:51.280: V/deltaSend(1942): 167
06-27 09:22:51.420: V/deltaSend(1942): 138
06-27 09:22:51.610: V/deltaSend(1942): 190
06-27 09:22:51.750: V/deltaSend(1942): 137
06-27 09:22:51.880: V/deltaSend(1942): 135
06-27 09:22:52.040: V/deltaSend(1942): 155
06-27 09:22:52.190: V/deltaSend(1942): 154
06-27 09:22:52.360: V/deltaSend(1942): 166
06-27 09:22:52.490: V/deltaSend(1942): 137
06-27 09:22:52.640: V/deltaSend(1942): 144
06-27 09:22:52.810: V/deltaSend(1942): 171
06-27 09:22:53.050: V/deltaSend(1942): 238
06-27 09:22:53.210: V/deltaSend(1942): 166
06-27 09:22:53.350: V/deltaSend(1942): 135
06-27 09:22:53.500: V/deltaSend(1942): 151
06-27 09:22:53.650: V/deltaSend(1942): 155
06-27 09:22:53.920: V/deltaSend(1942): 272
06-27 09:22:54.120: V/deltaSend(1942): 197
06-27 09:22:54.290: V/deltaSend(1942): 165
06-27 09:22:54.440: V/deltaSend(1942): 151
06-27 09:22:54.590: V/deltaSend(1942): 149
06-27 09:22:54.730: V/deltaSend(1942): 147
06-27 09:22:54.890: V/deltaSend(1942): 154
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 15 楼 shootingstars 的回复:
[quote=引用 11 楼 jackyvincefu 的回复:] [quote=引用 7 楼 shootingstars 的回复:] 如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
嗯,我用调试助手看也是这样,看起来跟PC端软件没什么关系,但是就是奇怪为什么会出现这种现象,看PC端软件有没有办法克服。 Android端Thread的Run函数代码如下:
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(port);
		           //创建一个InetAddree
		        InetAddress serverAddress = InetAddress.getByName(ipname);
		        byte data [] =myoutputstream.toByteArray();  //这是要传输的数据
		           //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号   
		        DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,port);
		           //调用socket对象的send方法,发送数据
		           socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           Log.v("deltaSend",Long.toString(deltasend));//打印时间间隔
		           timepre=timeaft;
		           socket.close();
			} catch (Exception e) {
				// TODO: handle exception	
				e.printStackTrace();
			}
			
		}
打印出的时间间隔均匀200ms左右。[/quote] 你是通过网线还是Wifi传输的?[/quote] 安卓的输出正常200ms间隔,我在安卓SendPacket设置了累计发送了200包进入断点,然后PC端wireshark数据也全部收到200包,没问题,只是接收的时间如上面所说的不是均匀200ms接收到。 是用手机采集视频的,wifi。
shootingstars 2013-06-27
  • 打赏
  • 举报
回复
引用 11 楼 jackyvincefu 的回复:
[quote=引用 7 楼 shootingstars 的回复:] 如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
嗯,我用调试助手看也是这样,看起来跟PC端软件没什么关系,但是就是奇怪为什么会出现这种现象,看PC端软件有没有办法克服。 Android端Thread的Run函数代码如下:
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(port);
		           //创建一个InetAddree
		        InetAddress serverAddress = InetAddress.getByName(ipname);
		        byte data [] =myoutputstream.toByteArray();  //这是要传输的数据
		           //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号   
		        DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,port);
		           //调用socket对象的send方法,发送数据
		           socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           Log.v("deltaSend",Long.toString(deltasend));//打印时间间隔
		           timepre=timeaft;
		           socket.close();
			} catch (Exception e) {
				// TODO: handle exception	
				e.printStackTrace();
			}
			
		}
打印出的时间间隔均匀200ms左右。[/quote] 你是通过网线还是Wifi传输的?
shootingstars 2013-06-27
  • 打赏
  • 举报
回复
引用 11 楼 jackyvincefu 的回复:
[quote=引用 7 楼 shootingstars 的回复:] 如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
嗯,我用调试助手看也是这样,看起来跟PC端软件没什么关系,但是就是奇怪为什么会出现这种现象,看PC端软件有没有办法克服。 Android端Thread的Run函数代码如下:
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(port);
		           //创建一个InetAddree
		        InetAddress serverAddress = InetAddress.getByName(ipname);
		        byte data [] =myoutputstream.toByteArray();  //这是要传输的数据
		           //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号   
		        DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,port);
		           //调用socket对象的send方法,发送数据
		           socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           Log.v("deltaSend",Long.toString(deltasend));//打印时间间隔
		           timepre=timeaft;
		           socket.close();
			} catch (Exception e) {
				// TODO: handle exception	
				e.printStackTrace();
			}
			
		}
打印出的时间间隔均匀200ms左右。[/quote] 你的Android的输出正常吗?
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 8 楼 wwwspider001 的回复:
不要纠结于接收的时间间隔 将图像收到后 缓冲一下 然后按照固定的帧速显示 这样就不会出现你说的卡顿了
嗯,只是觉得奇怪,肯定是哪个环节出现了问题,我也想说在本地缓冲然后按固定的帧速播放,但是Android端受限于不同的手机摄像头分辨率以及设置的图片质量,会造成每次取像大小不一样,处理时间不一样,发送的时间间隔也不一样,所以帧速没办法固定。。。 我这里想处理成安卓端怎么发就PC端怎么放。
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 7 楼 shootingstars 的回复:
如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
嗯,我用调试助手看也是这样,看起来跟PC端软件没什么关系,但是就是奇怪为什么会出现这种现象,看PC端软件有没有办法克服。 Android端Thread的Run函数代码如下:
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(port);
		           //创建一个InetAddree
		        InetAddress serverAddress = InetAddress.getByName(ipname);
		        byte data [] =myoutputstream.toByteArray();  //这是要传输的数据
		           //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号   
		        DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,port);
		           //调用socket对象的send方法,发送数据
		           socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           Log.v("deltaSend",Long.toString(deltasend));//打印时间间隔
		           timepre=timeaft;
		           socket.close();
			} catch (Exception e) {
				// TODO: handle exception	
				e.printStackTrace();
			}
			
		}
打印出的时间间隔均匀200ms左右。
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 6 楼 fishion 的回复:
想快速处理数据,可以用IOCP方式接收数据
这部分我再了解一下,谢谢!!!
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 5 楼 fishion 的回复:
先增加接收和发送缓冲区大小,接收端的缓冲区要大于发送端发送的数据。 然后设置SO_RCVBUF大小,设置个64K看看吧。android不知道能不能设置SO_SNDBUF了。 还有就是一包数据太大了,或者选择分包发送,把图片分割成多块发送,然后服务端接收一块就显示更新那一块的图片
我试过设置成64K,抓出来的数据也差不多,如下: delta=844======8514 delta=93======8549 delta=125======8596 delta=391======10249 delta=2484======10282 delta=0======9617 delta=16======9475 delta=0======8924 delta=16======9297 delta=0======10154 delta=0======10636 delta=0======9826 delta=187======11977 delta=359======10776 delta=375======9968 delta=1250======11491 delta=0======11764 delta=16======11298 delta=0======13320 delta=813======11533 delta=15======13829 delta=78======11905 delta=360======13226 delta=343======16414 delta=250======12328 delta=422======12368 delta=235======11755 delta=218======13434 delta=938======12706 delta=0======13095 delta=16======10658 delta=187======11670 delta=1078======12152 delta=16======11335 delta=15======13745 delta=0======13897 delta=266======12973 delta=219======12778 delta=187======12558 delta=172======12982 delta=1016======16041 delta=15======15595 delta=0======15523 delta=16======14800 delta=0======15720 delta=2016======13340 delta=0======12526 delta=31======13242 delta=0======13358 delta=0======13428 delta=0======12806 delta=0======13553 delta=0======12523 delta=937======11623 delta=0======12797 delta=3016======12514 delta=0======11994 delta=16======11713 delta=0======12003 delta=0======12588 delta=0======11658 delta=15======12496 delta=0======12388 delta=0======10576 delta=16======12345 delta=0======13008 delta=0======12720
shootingstars 2013-06-27
  • 打赏
  • 举报
回复
引用 22 楼 jackyvincefu 的回复:
[quote=引用 21 楼 shootingstars 的回复:] 你试试每次仅仅Send最大不超过500个字节?
安卓端修改代码如下:把每个包分成ncount+1个包进行发送
int ncount=data.length/500;
		        for(int i=0;i<ncount;i++)
		        {
		        	DatagramPacket packet = new DatagramPacket(data,i*500,500,serverAddress,port);
		        	socket.send(packet);
		        	timeaft=System.currentTimeMillis();
		        	long deltasend=timeaft-timepre;
		        	String string=Long.toString(deltasend)+"#"+Integer.toString(500);
		        	 Log.v("deltaSend",string);
			           timepre=timeaft;
		        }
		        DatagramPacket packet = new DatagramPacket(data,ncount*500,data.length%500,serverAddress,port);
		        socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           //String string=Long.toString(deltasend)+"#"+Integer.toString(abc);
		           String string=Long.toString(deltasend)+"#"+Integer.toString(data.length%500);
		           Log.v("deltaSend",string);
		           timepre=timeaft;
打印的结果:安卓端没问题
06-27 15:46:31.690: V/deltaSend(32390): 6#500
06-27 15:46:31.690: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 9#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 0#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 0#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 0#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 0#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 0#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 0#222
06-27 15:46:31.980: V/deltaSend(32390): 274#500
06-27 15:46:31.990: V/deltaSend(32390): 8#500
06-27 15:46:31.990: V/deltaSend(32390): 0#500
06-27 15:46:31.990: V/deltaSend(32390): 1#500
06-27 15:46:31.990: V/deltaSend(32390): 0#500
PC端,还是一样的异常。
delta=1829======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=15======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======227
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=3016======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======416
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
[/quote] 使用Wireshark看看数据传输过去了吗?
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 21 楼 shootingstars 的回复:
你试试每次仅仅Send最大不超过500个字节?
安卓端修改代码如下:把每个包分成ncount+1个包进行发送
int ncount=data.length/500;
		        for(int i=0;i<ncount;i++)
		        {
		        	DatagramPacket packet = new DatagramPacket(data,i*500,500,serverAddress,port);
		        	socket.send(packet);
		        	timeaft=System.currentTimeMillis();
		        	long deltasend=timeaft-timepre;
		        	String string=Long.toString(deltasend)+"#"+Integer.toString(500);
		        	 Log.v("deltaSend",string);
			           timepre=timeaft;
		        }
		        DatagramPacket packet = new DatagramPacket(data,ncount*500,data.length%500,serverAddress,port);
		        socket.send(packet);
		           timeaft=System.currentTimeMillis();
		           long deltasend=timeaft-timepre;
		           //String string=Long.toString(deltasend)+"#"+Integer.toString(abc);
		           String string=Long.toString(deltasend)+"#"+Integer.toString(data.length%500);
		           Log.v("deltaSend",string);
		           timepre=timeaft;
打印的结果:安卓端没问题
06-27 15:46:31.690: V/deltaSend(32390): 6#500
06-27 15:46:31.690: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 9#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 0#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 0#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.700: V/deltaSend(32390): 0#500
06-27 15:46:31.700: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 0#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 0#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 1#500
06-27 15:46:31.710: V/deltaSend(32390): 0#222
06-27 15:46:31.980: V/deltaSend(32390): 274#500
06-27 15:46:31.990: V/deltaSend(32390): 8#500
06-27 15:46:31.990: V/deltaSend(32390): 0#500
06-27 15:46:31.990: V/deltaSend(32390): 1#500
06-27 15:46:31.990: V/deltaSend(32390): 0#500
PC端,还是一样的异常。
delta=1829======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=15======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======227
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=3016======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======416
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
delta=0======500
shootingstars 2013-06-27
  • 打赏
  • 举报
回复
引用 19 楼 jackyvincefu 的回复:
[quote=引用 18 楼 shootingstars 的回复:] 再打印一下发送数据大小
如下,#号前是时间间隔,#后是每包数据大小
06-27 14:42:17.620: V/deltaSend(27046): 200#11802
06-27 14:42:17.800: V/deltaSend(27046): 172#14401
06-27 14:42:17.970: V/deltaSend(27046): 173#14328
06-27 14:42:18.150: V/deltaSend(27046): 175#14376
06-27 14:42:18.340: V/deltaSend(27046): 192#15284
06-27 14:42:18.510: V/deltaSend(27046): 177#15537
06-27 14:42:18.740: V/deltaSend(27046): 223#14723
06-27 14:42:18.960: V/deltaSend(27046): 221#12306
06-27 14:42:19.120: V/deltaSend(27046): 164#12207
06-27 14:42:19.290: V/deltaSend(27046): 169#14259
06-27 14:42:19.490: V/deltaSend(27046): 198#11138
06-27 14:42:19.650: V/deltaSend(27046): 167#13174
06-27 14:42:19.800: V/deltaSend(27046): 141#14280
06-27 14:42:20.030: V/deltaSend(27046): 223#12923
06-27 14:42:20.170: V/deltaSend(27046): 153#15614
06-27 14:42:20.380: V/deltaSend(27046): 206#15417
06-27 14:42:20.570: V/deltaSend(27046): 188#15194
06-27 14:42:20.759: V/deltaSend(27046): 181#17358
06-27 14:42:20.960: V/deltaSend(27046): 218#16776
06-27 14:42:21.150: V/deltaSend(27046): 185#17777
06-27 14:42:21.340: V/deltaSend(27046): 188#17110
06-27 14:42:21.510: V/deltaSend(27046): 161#17481
06-27 14:42:21.740: V/deltaSend(27046): 231#17764
06-27 14:42:22.050: V/deltaSend(27046): 317#16260
06-27 14:42:22.340: V/deltaSend(27046): 290#17583
06-27 14:42:22.570: V/deltaSend(27046): 229#16583
06-27 14:42:22.850: V/deltaSend(27046): 270#17208
[/quote] 你试试每次仅仅Send最大不超过500个字节?
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
刚才我采用TCP方式重写了PC端和安卓端,然后发现不会出现这个问题。PC端的新线程while中用下面的代码接收
int count=0;
		do 
		{
			result=recv(sockConn,recvBuff,sizeof(recvBuff),0);
			memcpy_s(imageBuff+count,result,recvBuff,result);
			count+=result;
		} while (result!=0);
打印出来的结果如下,没问题
delta=219======31244
delta=203======29909
delta=203======24529
delta=219======28051
delta=235======24380
delta=187======27804
delta=31======27440
delta=219======24215
delta=141======24979
delta=250======26175
delta=328======27405
delta=219======28048
delta=125======29138
delta=78======31836
delta=203======28371
delta=125======28968
delta=187======31344
delta=203======32300
delta=219======33851
delta=110======33582
delta=171======34880
delta=172======33298
delta=172======33976
delta=188======34477
delta=172======33360
delta=218======34424
delta=141======31967
delta=172======34164
delta=172======34049
delta=203======34732
delta=172======32857
delta=172======34121
delta=187======34514
delta=172======33993
delta=250======31830
delta=109======34313
delta=157======34445
delta=171======35049
delta=188======35175
delta=234======35559
delta=188======33362
delta=187======33603
delta=157======33377
delta=234======27528
delta=141======29112
delta=203======31587
delta=187======36358
大神们再帮忙分析下UDP问题。
偶尔e网事 2013-06-27
  • 打赏
  • 举报
回复
引用 18 楼 shootingstars 的回复:
再打印一下发送数据大小
如下,#号前是时间间隔,#后是每包数据大小
06-27 14:42:17.620: V/deltaSend(27046): 200#11802
06-27 14:42:17.800: V/deltaSend(27046): 172#14401
06-27 14:42:17.970: V/deltaSend(27046): 173#14328
06-27 14:42:18.150: V/deltaSend(27046): 175#14376
06-27 14:42:18.340: V/deltaSend(27046): 192#15284
06-27 14:42:18.510: V/deltaSend(27046): 177#15537
06-27 14:42:18.740: V/deltaSend(27046): 223#14723
06-27 14:42:18.960: V/deltaSend(27046): 221#12306
06-27 14:42:19.120: V/deltaSend(27046): 164#12207
06-27 14:42:19.290: V/deltaSend(27046): 169#14259
06-27 14:42:19.490: V/deltaSend(27046): 198#11138
06-27 14:42:19.650: V/deltaSend(27046): 167#13174
06-27 14:42:19.800: V/deltaSend(27046): 141#14280
06-27 14:42:20.030: V/deltaSend(27046): 223#12923
06-27 14:42:20.170: V/deltaSend(27046): 153#15614
06-27 14:42:20.380: V/deltaSend(27046): 206#15417
06-27 14:42:20.570: V/deltaSend(27046): 188#15194
06-27 14:42:20.759: V/deltaSend(27046): 181#17358
06-27 14:42:20.960: V/deltaSend(27046): 218#16776
06-27 14:42:21.150: V/deltaSend(27046): 185#17777
06-27 14:42:21.340: V/deltaSend(27046): 188#17110
06-27 14:42:21.510: V/deltaSend(27046): 161#17481
06-27 14:42:21.740: V/deltaSend(27046): 231#17764
06-27 14:42:22.050: V/deltaSend(27046): 317#16260
06-27 14:42:22.340: V/deltaSend(27046): 290#17583
06-27 14:42:22.570: V/deltaSend(27046): 229#16583
06-27 14:42:22.850: V/deltaSend(27046): 270#17208
wwwspider001 2013-06-26
  • 打赏
  • 举报
回复
不要纠结于接收的时间间隔 将图像收到后 缓冲一下 然后按照固定的帧速显示 这样就不会出现你说的卡顿了
shootingstars 2013-06-26
  • 打赏
  • 举报
回复
如果通过wireshark看到的报文有问题,这个与PC机没啥关系吧。UDP发过来的东西,PC机你愿收不收的。 所以你需要看看你的Android的发送问题。。。 你如果要贴,还是贴Android的代码吧。
fishion 2013-06-26
  • 打赏
  • 举报
回复
想快速处理数据,可以用IOCP方式接收数据
加载更多回复(5)

18,356

社区成员

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

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