linux多网卡udp组播收不到数,UDP组播,完成端口,双网卡收不到数据?帮帮忙

当前位置:我的异常网» 网络通信 » UDP组播,完成端口,双网卡收不到数据?帮帮忙

UDP组播,完成端口,双网卡收不到数据?帮帮忙

www.myexceptions.net  网友分享于:2013-04-13  浏览:848次

UDP组播,完成端口,双网卡收不到数据?各位大哥,帮帮忙?

各位大哥:

小弟我写了一个网络通信程序,通过完成端口在指定的网卡上接收网络上传输过来的语音数据,现在情况是:

1:各主机均配置了两张网卡,其中一张网卡由该程序使用,另一张网卡其他程序在用;

2:程序在大部分客户端上运行都正常,唯独在其中一个客户端上GetQueuedCompletionStatus该函数不返回,若该客户端把另一张网卡的网线拔掉,或者禁用掉该网卡,启动软件工作正常。在工作过程中插上另一张网卡的网线也没有问题。但是如果在程序启动前两张网卡都在工作,则GetQueuedCompletionStatus不返回。

主要代码如下:

调用Create函数的代码:

m_Receive.Create(uLocalPort,lpDstStr,0, lpBindAddr)

uLocalPort:组播端口

lpDstStr:组播地址

lpBindAddr:本机上要绑定的网卡地址

bool CUdpSocket::Create(USHORT uLocalPort,LPCTSTR lpDstAddr,USHORT uDstPort,LPCTSTR lpBindAddr/*=NULL*/)

{

if ( htons(uLocalPort) == m_stLclAddr.sin_port

&& m_stDstAddr.sin_addr.s_addr == inet_addr(lpDstAddr)

&& m_stDstAddr.sin_port == htons(uDstPort))

{

return true ;

}

//*/

if (!CreateSocket(uLocalPort,lpBindAddr))

return false ;

/* Assign our destination address */

m_stDstAddr.sin_family = AF_INET;

m_stDstAddr.sin_addr.s_addr = inet_addr(lpDstAddr);

m_stDstAddr.sin_port = htons(uDstPort);

//广播

if(strstr(lpDstAddr,"255"))

{

BOOL bEnable = TRUE ;

int nRes = setsockopt(m_socket,SOL_SOCKET,SO_BROADCAST,(const char*)&bEnable,sizeof(bEnable));

}

//

else

{

// note the 2 says how many concurrent cpu bound threads to allow thru

// this should be tunable based on the requests. CPU bound requests will

// really really honor this.

//

JoinMultiCastGroup(lpDstAddr,uDstPort);

}

//* Disable loopback */

//*/

BOOL fFlag = FALSE;

int nRet = setsockopt(m_socket,

IPPROTO_IP,

IP_MULTICAST_LOOP,

(char *)&fFlag,

sizeof(fFlag));

if (nRet == SOCKET_ERROR) {

printf ("setsockopt() IP_MULTICAST_LOOP failed, Err: %d\n",

WSAGetLastError());

return false ;

}

//*/

//

return CreateCompleteIO();

}

bool CUdpSocket::JoinMultiCastGroup(LPCTSTR lpDstAddr, USHORT uDstPort)

{

/* Assign our destination address */

m_stDstAddr.sin_family = AF_INET;

m_stDstAddr.sin_addr.s_addr = inet_addr(lpDstAddr);

m_stDstAddr.sin_port = htons(uDstPort);

struct ip_mreq stMreq; /* Multicast interface structure */

/* Join the multicast group

*

* NOTE: According to RFC 1112, a sender does not need to join the

* group, however Microsoft requires a socket to join a group in

* order to use setsockopt() IP_MULTICAST_TTL (or fails with error

* WSAEINVAL).

*/

stMreq.imr_multiaddr.s_addr = inet_addr(lpDstAddr);

stMreq.imr_interface.s_addr = INADDR_ANY;

int nRet = setsockopt(m_socket,

IPPROTO_IP,

IP_ADD_MEMBERSHIP,

(char *)&stMreq,

sizeof(stMreq));

if (nRet == SOCKET_ERROR) {

printf (

"setsockopt() IP_ADD_MEMBERSHIP address %s failed, Err: %d\n",

lpDstAddr, WSAGetLastError());

return false ;

}

/* Set IP TTL to traverse up to multiple routers */

//*

u_long lTTL = 2 ;

nRet = setsockopt(m_socket,

IPPROTO_IP,

IP_MULTICAST_TTL,

(char *)&lTTL,

sizeof(lTTL));

if (nRet == SOCKET_ERROR) {

printf ("setsockopt() IP_MULTICAST_TTL failed, Err: %d\n",

WSAGetLastError());

}

//*/

return true ;

}

//

bool CUdpSocket::CreateCompleteIO()

{

m_hCompletionPort = CreateIoCompletionPort (INVALID_HANDLE_VALUE,NULL,0,1);

if (!m_hCompletionPort)

{

printf ("m_hCompletionPort Create Failed\n");

return false;

}

//Associate this socket to this I/O completion port

文章评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DllMain详解

1 DLL的进入/退出函数 1.1 DllMain简介 跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。以“DllMain”为关键字,来看看MSDN帮助文档怎么介绍这个函数的。 The DllMain function is an optional method of entr…

linux 视频学习

Linux 系统管理员要求对系统进行管理,备份等操作,linux程序员需要掌握c,c,java,php,jsp等 Linux平台上的开发,包括vi,gcc,gdb,make,jdk,tomcat,mysql… 书籍介绍:鸟哥LINUX私房菜,LINUX编程从入门到精通,li…

linux安装tensorflow教程,真正从零开始,TensorFlow详细安装入门图文教程!

在正式开始之前我想说:一定要注意窗口给出的提示(英文)。在实际操作中可能会碰到各种各样的问题,但常见的问题其实都可以根据它的报错信息找到原因,只要上网搜一搜相应的信息就能解决,甚至它自己就会给出解决的建议。如果你发现你…

引路蜂地图API:Gis.Navigation包定义

本包提供了路口到路口实时导航API,从地图服务器返回的路径信息含有文字和路径的地理坐标信息,类NavigationEngine根据路径和当前坐标实现实时导航。它内部含用三个工作线程: Location Monitor 实时监视当前位置坐标是否偏离路径,如…

ubuntu下安装opensips

1. 下载opensips1.8版本,并解压到 "/usr/local/src" 目录下 ;2. 安装必要的软件包,apt-get install flex bison libncurses-dev3. 进入opensips源码目录,make menuconfig出现opensips的配置界面后1) 选择"Configur…

linux 修改Db2主机名,修改DB2服务器的主机名

环境:产品:DB2 UDB平台:AIX,Solaris,HP-UX,Linux,Windows版本:V8 V9.1V9.5为了修改服务器的主机名,我们可以在DB2数据库服务器上执行以下步骤来实现:1) 停止DB2管理服务器…

用OpenMP加速你的程序[转]

最近在看多核编程。简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核 CPU的强大功能,于是多核编程应运而生。按照我的理解,多核编程可以认为是对多线程…

错误./hello: error while loading shared libraries: libQtGui.so.4: cannot open shared object file:

之前一直想在ARM 上跑qt,但都出现错误: ./hello: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory 这主要是ARM 上的运行环境设置不当: 我用的是飞凌的6410 环境变量设…

linux 指令引用变量,Linux之变量引用与命令替换

在bash脚本编写中,我们时常需要引用变量与替换命令,为规范操作,现对其做简单的总结说明。引用引用就是指将字符串用引用符号括起来,以防止特殊字符被shell脚本解释为其他意义。引用时屏蔽特殊字符的特殊意义,而将其解释…

有些垃圾网站转载都不会

有时会看到我的文章被转载,只要保留作者信息和原文链接,并且忠实于原文都是很欢迎的。这里的忠实原文应该是最基本的了吧,转载嘛,最简单的也就是拷贝粘贴吧,可发现有些垃圾网站,连拷贝粘贴都做不好&#xf…

移植tslib到开发板及部分问题解决

qt的tslib的具体移植步骤和过程就不多讲了,我说说我按照手册移植好tslib后在开发板运行提示的错误以及我的解决方法,当然每个人的提示可能一样,解决方法就不一样,我也是个初学者,所以方法仅供大家参考!问题…

Content Provider 基础 之URI

Keywords: content provider, URIContent Provider这个东西在Android平台上是最常用的共享数据的方法(似乎应用程序之间共享数据也只有这种方法吧,待求证)。虽然常用,但是这个东 西要理解透彻还是要先掌握一些基础的。URI就是Cont…

linux shell 原理,linux下shell的工作原理

linux下shell的工作原理2009-12-8 10:19:53 出处:https://www.yqdown.comshell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省运用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特…

解决SerMyAdmin无法登陆的问题

1. 首先确认默认的用户名和密码,因为每个版本的SerMyAdmin的默认用户名密码可能不同,根据 《Building Telephony Systems with OpenSIPS 1.6》这本书上所说的SerMyAdmin的用户名和密码是 adminsetup和secret。但是从我的SerMyAdmin安装包里的MySql数据…

oracle.cmd

--更改列顺序 SELECT * FROM ALL_OBJECTS WHERE OWNER TDDJ AND OBJECT_NAMELSZD_JZDZB AND OBJECT_TYPETABLE--54529 SELECT OBJ#,COL#,NAME FROM SYS.COL$ WHERE OBJ# 57689; UPDATE SYS.COL$ SET COL# 9 WHERE OBJ# 57689 AND NAME XMBM; UPDATE SYS.COL$ SET COL# 7 WHE…

Linux部署动态网页,linux构建动态WEB服务器安装篇

linux构建动态WEB服务器安装篇发布时间:2008-09-18 08:50:01 作者:佚名 我要评论基本配置安装web服务器:httpd-2.X.X先优化吧根据CPU设置变量#export CFLAGS”-O2 -marchpentium4 -pipe” && CXXFLAGS$CFLAGS“-march”选项表示为特定的cpu…

sip事务与对话

一个事务通常由一个请求开始,由一个响应码(a response code)结束。VIA头域中的branch参数用来标识一个事务。 对话可以是开始于一个INVITE事务,结束于一个BYE事务。一个对话由FROM,TO和CALL-ID头域的结合所…

[转]Win7 系统安装VS2008没反应 点击安装一闪就没有反应 .

原文地址:http://blog.csdn.net/mingjie_520/article/details/6757960 Win7 系统上用虚拟光驱安装 VS2008 没反应,安装不启解决方案VS2008 ISO境像文件,解开来安装的话,也没有问题,不过真的很慢,解出又占空…

apt-get的更新源

1、先备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表,有备无患嘛.) 2、修改更新源 sudo gedit /etc/apt/sources.list (打开源列表文件) 3、修改 deb http://mirrors.sohu.com…

电脑用linux命令大全,电脑操作时常用的一些Linux命令

电脑操作时常用的一些Linux命令1、修改密码:passwd用户名2、下载jdk-6u25-linux-i586.bin3、运行(cd进入某一目录后,/usr/jdk-6u25-linux-i586.bin解压缩操作)sh jdk-6u25-linux-i586.bin4、到opadmin home目录下改环境变量vi .bash_profile编辑用户主目…