基于udp的网络编程socket的错误10054与SOCKET的发送与接收缓冲区 socket接收缓冲区大小

哎!长叹一声!今天上班很鬼火,被老板骂了一顿,严重的打击了我的自信!哎,鬼火啊,到今天下班以前,才把任务完成了一点点。明天要继续努力哦!总结今天碰到的问题。

首先:今天在做一个视频转发器,用vlc播放器推视频流,通过转发器然后发送到另外一个pc,然后用vlc播放器播放,这些都是基于udp的socket的。

在基于udp的socket的发送数据是,碰到了主要两个问题。

1、关于UDP socket 的10054错误

[cpp] view plaincopy

FD_ZERO(&rfd);//在使用之前总是要清空

FD_ZERO(&wfd);

//开始使用select

FD_SET(PrimaryUDP,&rfd);//把PrimaryUDP(socket)放入要测试的描述符集中

intmaxfdp=PrimaryUDP>PrimaryUDP1?PrimaryUDP+1:PrimaryUDP1+1;

intnRet=select(maxfdp,&rfd,0,NULL,&timeout);//检测是否有套接口是否可读

//nRet返回的-1,所以这出现问题了,经过WSAGetLastError()返回的是10054

//if(nRet==SOCKET_ERROR)

//{

//printf("select()%d/n",WSAGetLastError());

//return1;

//}

//elseif(nRet==0)//超时

//{

//printf("timeout/n");

//closesocket(PrimaryUDP);

//closesocket(PrimaryUDP1);

//break;

//}

[cpp] view plaincopy

intnRet=select(maxfdp,&rfd,0,NULL,&timeout);//检测是否有套接口是否可读

//nRet返回的-1,所以这出现问题了,经过WSAGetLastError()返回的是10054

经过查证:网上说的是winsock自已的bug。在初始化SOCKET时加上底下这段代码,就可以解决以上的问题。

[cpp] view plaincopy

DWORDdwBytesReturned=0;

BOOLbNewBehavior=FALSE;

DWORDstatus;

status=WSAIoctl(PrimaryUDP,SIO_UDP_CONNRESET,

&bNewBehavior,sizeof(bNewBehavior),

NULL,0,&dwBytesReturned,

NULL,NULL);

if(SOCKET_ERROR==status)

{

DWORDdwErr=WSAGetLastError();

if(WSAEWOULDBLOCK==dwErr)

{

//nothingtodo

return(FALSE);

}

else

{

printf("WSAIoctl(SIO_UDP_CONNRESET)Error:%d\n",dwErr);

return(FALSE);

}

}

2、SOCKET的发送与接收缓冲区
基于udp的网络编程socket的错误10054与SOCKET的发送与接收缓冲区 socket接收缓冲区大小

在我用vlc播放器不断地向转发器发送udp数据包时,经过转发器转发数据,可是在这里出现了一个问题,就是视频流的udp数据包丢失很严重,使的在另外一台电脑的vlc播放器播放视频的时候都是花的,抓取数据包,丢了很多数据包。udp数据包在局域网都丢了这么多数据包,肯定不正常。

减少丢包方法: 1:设置缓冲! 2:使用线程池。

所以我我设置SOCKET的发送与接收缓冲区,经过设置以后,丢包的情况就改善很好了,视频能够正常的播放了。

设置方法为:

int optVal = 32*1024 ;

int optLen = sizeof(int);

setsockopt(PrimaryUDP,SOL_SOCKET,SO_RCVBUF,(char*)&optVal,optLen);

这个是这事socket PrimaryUDP的接受缓冲区为32*1024,即32K

//发送缓冲区

int nSendBuf=32*1024;//设置为32K

setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

参考文献:

http://blog.csdn.net/wesleyluo/article/details/6149071

http://blog.csdn.net/ccnucjp8136/article/details/4515002

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/56373.html

更多阅读

串口通信的分类 基于fpga的串口通信

串口通信的分类串口通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。2.1同步通信同步通信是一种连续串行传送数据的通信方式,一次通信

windows网络编程socket) c语言socket网络编程

应用程序创建socket,通过绑定,socket与驱动程序联系,向socket发送的数据通过驱动发到网络。端口号标识在同一台计算机上运行的不同网络程序。1.socket函数SOCKET socket(int af, int type, int protocol)af: 地址族,对于TCP/IP只能是AF_I

常见网络编程面试题答案征集与面试题收集 网络编程常见面试题

1:tcp和udp的区别2:流量控制和拥塞控制的实现机制3:滑动窗口的实现机制4:多线程如何同步。5:进程间通讯的方式有哪些,各有什么优缺点6:tcp连接建立的时候3次握手的具体过程,以及其中的每一步是为什么7:tcp断开连接的具体过程,其中每一步是为什

基于标准的课程设计:开发表现性评价

朱伟强* 崔允漷**摘 要:国家颁布的课程标准,作为一种政策力量,规范着课程的实践。新课程提出了建立发展性评价的理念,课程设计和教学实践要求用评价来促进学习,评价设计先于教学实施。本文主要讨论设计基于标准的课程需要思考的第二个问

基于MATLAB的语音信号处理 图像处理相关设计

基于MATLAB的语音信号处理本文转载自龙行天下《基于MATLAB的语音信号处理》程序1:用MATLAB对原始语音信号进行分析,画出它的时域波形和频谱fs=8000;%语音信号采样频率为8000x1=wavread('pb8k.wav');t=(0:length(x1)-1)/8000;

声明:《基于udp的网络编程socket的错误10054与SOCKET的发送与接收缓冲区 socket接收缓冲区大小》为网友誰銄訫髒開叻槍分享!如侵犯到您的合法权益请联系我们删除