社区
网络编程
帖子详情
Winsock用UDP的socket,无法绑定IP端口,老是10049错误,“在其上下文中,该请求的地址无效”。怎么解决?谁能给个例子
stoat
2008-09-12 06:39:49
Winsock用UDP的socket,无法绑定IP端口,老是10049错误,“在其上下文中,该请求的地址无效”。怎么解决?
...全文
808
5
打赏
收藏
Winsock用UDP的socket,无法绑定IP端口,老是10049错误,“在其上下文中,该请求的地址无效”。怎么解决?谁能给个例子
Winsock用UDP的socket,无法绑定IP端口,老是10049错误,“在其上下文中,该请求的地址无效”。怎么解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
stoat
2008-09-14
打赏
举报
回复
呵呵,就是这里影响到bind了,谢了!
local.sin_addr.s_addr = INADDR_ANY;//三处
标准的写法是 local.sin_addr.s_addr = htonl(INADDR_ANY); 不过INADDR_ANY就是0,转不转字节序都一样
内存泄漏
2008-09-12
打赏
举报
回复
local.sin_port = htons((short)0); ??????? 换1024以后的别的端口试试..
rookieme
2008-09-12
打赏
举报
回复
改了3处 :
SOCKADDR_IN local;
SOCKADDR_IN dest;
SOCKADDR_IN from;
char send[8] = {"1234567"};
int len = 8;
char recv[1024] = {0};
int recvLen = 1024;
int rc;
int a;
int addLen = 0;//sizeof(SOCKADDR_IN);一处
SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);//0);二处
dest.sin_family = AF_INET;
dest.sin_port = htons((short)5000);
dest.sin_addr.s_addr = inet_addr("192.168.3.222");
local.sin_family = AF_INET;
local.sin_port = htons((short)0);
local.sin_addr.s_addr = INADDR_ANY;//三处
rc = bind(sock, (sockaddr*)&local, sizeof(SOCKADDR_IN));
if (rc == SOCKET_ERROR)
{
a = WSAGetLastError();
}
rc = sendto(sock, send, len, 0, (sockaddr*)&dest, sizeof(SOCKADDR_IN));
if (rc == SOCKET_ERROR)
{
a = WSAGetLastError();
}
rc = recvfrom(sock, recv, recvLen, 0, (LPSOCKADDR)&from, &addLen);
if (rc == SOCKET_ERROR)
{
a = WSAGetLastError();
}
stoat
2008-09-12
打赏
举报
回复
WSAData wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
SOCKADDR_IN local;
SOCKADDR_IN dest;
SOCKADDR_IN from;
char send[8] = {"1234567"};
int len = 8;
char recv[1024] = {0};
int recvLen = 1024;
int rc;
int a;
int addLen = sizeof(SOCKADDR_IN);
SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);
dest.sin_family = AF_INET;
dest.sin_port = htons((short)5000);
dest.sin_addr.s_addr = inet_addr("192.168.3.222");
local.sin_family = AF_INET;
local.sin_port = htons((short)6);
local.sin_addr.s_addr = inet_addr("INADDR_ANY");//INADDR_ANY
rc = bind(sock, (sockaddr*)&local, sizeof(SOCKADDR_IN));
if (rc == SOCKET_ERROR)
{
a = WSAGetLastError();
}
rc = sendto(sock, send, len, 0, (sockaddr*)&dest, sizeof(SOCKADDR_IN));
if (rc == SOCKET_ERROR)
{
a = WSAGetLastError();
}
rc = recvfrom(sock, recv, recvLen, 0, (sockaddr*)&from, &addLen);
if (rc == SOCKET_ERROR)
{
a = WSAGetLastError();
}
WSACleanup();
rookieme
2008-09-12
打赏
举报
回复
代码?
UDP
组播 vc
例子
组播主要有以下几个步骤:1. 建立支持数据报的scoket2. 把
socket
和本地的一个
端口
绑定
(以后会通过这个
端口
进行数据的收发)3. 通过setsockopt
IP
_ADD_MEMBERSH
IP
加入一个组播组4. 然后就能通过sendto / recvfrom进行数据的收法5. 通过 setsockopt
IP
_DROP_MEMBERSH
IP
离开一个组播组6. 关闭
socket
如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据五.
winsock
2组播
winsock
2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据
socket
的模式,组播的实现构架有很大的关系)
winsock
2组播的主要有以下几个步骤1. 建立支持数据报的
socket
(用WSA
Socket
建立
socket
,同2. 时设置组播的一些属性)3. 把
socket
和本地的一个
端口
绑定
(以后会通过这个
端口
进行数据的收发)4. 通过WSAJoinLeaf加入一个组播组5. 通过sendto / recvfrom进行数据的收发6. 直接关闭
socket
,7. 退出组播组
多播 Multicast
Socket
对于
UDP
组播的一些认识
利用
UDP
组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在
IP
出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),
UDP
组播有了很大的优化,只有终端加入到了一个广播组,
UDP
组播的数据才能被他接受到.
UDP
组播是采用的无连接,数据报的连接方式,所以是不可靠的.也就是数据能不能到达接受端和数据到达的顺序都是不能保证的.但是由于
UDP
不用保证数据的可靠性,所有数据的传送速度是很快的.
1. 组播的“根”
组播从概念上来讲分为两部分:控制部分和数据部分。控制部分决定着组播的对象的组织方式。而数据部分决定了数据的传输方式。
控制层有“有根”,“无根”两种情况。对于有根的控制层,存在着一个root和若干个leaf. root负责管理这个组播组,只有他能邀请一个leaf加入一个组播组(ATM就是有根控制的一个典型的
例子
)。对于无根的控制层,没有root,只有若干的leaf. 每一个leaf都能自己加入一个组播组(
IP
就是无根控制的典型
例子
)
数据层也有“有根”,“无根”两种情况。对于有根数据层,从root发出的数据能到达每一个leaf,而从leaf发出的数据只能到达root.对于无根数据层,每一个leaf发出的数据能到达组播组
中
的每一个leaf(甚至包括他自己)。每一个leaf也能接受组播组里的任何数据包。
二.
IP
组播
地址
IP
组播通信需要一个特殊的组播
地址
.
IP
组播
地址
是一组D类
IP
地址
,范围从224.0.0.0 到 239.255.255.255。其
中
还有很多
地址
是为特殊的目的保留的。224.0.0.0到224.0.0.255的
地址
最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议)
三.IGMP协议
IGMP(internet网关管理协议)是
IP
组播的基础.在
IP
协议出现以后,为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。
当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,告诉他子网内有人对发送到某一个组播组的数据感兴趣.路由器也会定时向子网内的所有终端发送一条查询消息,用于询问是否还有人对某个组播组的数据感兴趣。如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。在IGMP第二版
中
,一个终端推出组播组以后,会向路由器发送一个推出消息,路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了(IGMP第一版
中
没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了]
四.
winsock
1组播
winsock
1的组播主要有以下几个步骤:
1. 建立支持数据报的scoket
2. 把
socket
和本地的一个
端口
绑定
(以后会通过这个
端口
进行数据的收发)
3. 通过setsockopt
IP
_ADD_MEMBERSH
IP
加入一个组播组
4. 然后就能通过sendto / recvfrom进行数据的收法
5. 通过 setsockopt
IP
_DROP_MEMBERSH
IP
离开一个组播组
6. 关闭
socket
如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据
五.
winsock
2组播
winsock
2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据
socket
的模式,组播的实现构架有很大的关系)
winsock
2组播的主要有以下几个步骤
1. 建立支持数据报的
socket
(用WSA
Socket
建立
socket
,同2. 时设置组播的一些属性)
3. 把
socket
和本地的一个
端口
绑定
(以后会通过这个
端口
进行数据的收发)
4. 通过WSAJoinLeaf加入一个组播组
5. 通过sendto / recvfrom进行数据的收发
6. 直接关闭
socket
,
7. 退出组播组
多播 Multicast
Socket
示例
去掉了下载分限制对于
UDP
组播的一些认识 利用
UDP
组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在
IP
出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),
UDP
组播有了很大的优化,只有终端加入到了一个广播组,
UDP
组播的数据才能被他接受到.
UDP
组播是采用的无连接,数据报的连接方式,所以是不可靠的.也就是数据能不能到达接受端和数据到达的顺序都是不能保证的.但是由于
UDP
不用保证数据的可靠性,所有数据的传送速度是很快的.1. 组播的“根” 组播从概念上来讲分为两部分:控制部分和数据部分。控制部分决定着组播的对象的组织方式。而数据部分决定了数据的传输方式。 控制层有“有根”,“无根”两种情况。对于有根的控制层,存在着一个root和若干个leaf. root负责管理这个组播组,只有他能邀请一个leaf加入一个组播组(ATM就是有根控制的一个典型的
例子
)。对于无根的控制层,没有root,只有若干的leaf. 每一个leaf都能自己加入一个组播组(
IP
就是无根控制的典型
例子
) 数据层也有“有根”,“无根”两种情况。对于有根数据层,从root发出的数据能到达每一个leaf,而从leaf发出的数据只能到达root.对于无根数据层,每一个leaf发出的数据能到达组播组
中
的每一个leaf(甚至包括他自己)。每一个leaf也能接受组播组里的任何数据包。二.
IP
组播
地址
IP
组播通信需要一个特殊的组播
地址
.
IP
组播
地址
是一组D类
IP
地址
,范围从224.0.0.0 到 239.255.255.255。其
中
还有很多
地址
是为特殊的目的保留的。224.0.0.0到224.0.0.255的
地址
最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议)三.IGMP协议 IGMP(internet网关管理协议)是
IP
组播的基础.在
IP
协议出现以后,为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。 当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,告诉他子网内有人对发送到某一个组播组的数据感兴趣.路由器也会定时向子网内的所有终端发送一条查询消息,用于询问是否还有人对某个组播组的数据感兴趣。如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。在IGMP第二版
中
,一个终端推出组播组以后,会向路由器发送一个推出消息,路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了(IGMP第一版
中
没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了] 四.
winsock
1组播
winsock
1的组播主要有以下几个步骤:1. 建立支持数据报的scoket2. 把
socket
和本地的一个
端口
绑定
(以后会通过这个
端口
进行数据的收发)3. 通过setsockopt
IP
_ADD_MEMBERSH
IP
加入一个组播组4. 然后就能通过sendto / recvfrom进行数据的收法5. 通过 setsockopt
IP
_DROP_MEMBERSH
IP
离开一个组播组6. 关闭
socket
如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据五.
winsock
2组播
winsock
2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据
socket
的模式,组播的实现构架有很大的关系)
winsock
2组播的主要有以下几个步骤1. 建立支持数据报的
socket
(用WSA
Socket
建立
socket
,同2. 时设置组播的一些属性)3. 把
socket
和本地的一个
端口
绑定
(以后会通过这个
端口
进行数据的收发)4. 通过WSAJoinLeaf加入一个组播组5. 通过sendto / recvfrom进行数据的收发6. 直接关闭
socket
,7. 退出组播组
易语言-使用 Raw
Socket
捕获网卡/指定程序/指定
端口
/指定
IP
数据包
本文章将介绍如何使用Raw
Socket
(原始套接字)开发网络嗅探器: 首先我们得了解什么是套接字,这个我就不多说,自己百度,百度百科比我说的好。 那么什么又是原始套接字呢,常用的套接字分为 SOCK_STREAM(流套接字) 用于TCPXY通讯。 SOCK_DGRAM(数据报套接字) 同于
UDP
XY通讯。 那么原始呢,他则是和名字一样原始套接字;举例:要想用流套接字进行一次TCP的发包,那么直接连接上对方服务器然后用Send就可以发送指定的内容,但其实发送的数据并不止你的那些内容,有一些东西是流套接字会给你自动补上的。TCP是属于
IP
XY的一个子XY,那么要发送一个TCP数据包就得加上(以太网XY报头这个先不提),
IP
XY的报头,和TCPXY报头,这些东西流套接字都会帮你处理,而原始套接字则不会(当然也可以设置让原始套接字构造
IP
报头)。原始套接字他有更多的用途,但相对来说也比流套接字或数据报套接字麻烦。 原始套接字还可以设置成允许接收本地所有的套接字数据。那么我们就利用这个功能来做嗅探器! 首先:1.使用 WSAStartup (合并短整数 (2, 2), WSADATA) 来初始化Win
socket
服务 其参数有2个 第一个 (短整数型/双字节型):wVersionRequired 这个参数表明使用的
winsock
版本号,高位指定修订版本号,低位指定主版本号。第二个参数 WSADATA类型 用于接收Win
socket
细节东西,咱不用管它。 //下面就不说那么详细了,源码里面全是注释,自己看。 2.然后使用
socket
(#AF_INET, #SOCK_RAW, #
IP
PROTO_
IP
) 来创建一个套接字 第一个参数应该是表明Internet
地址
格式反正只能固定这个,仅仅支持这个 参数2:表明要创建的是一个原始套接字,参数3:指定
IP
XY
IP
XY包括其子XY TCP
UDP
等。成功返回套接字句柄 3. bind (s, addr, sizeof (addr)) 将套接字
绑定
至指定网卡,参数1=套接字句柄 参数2为一个addr结构的值,该值表明要
绑定
的网卡
IP
及
端口
号 4. ioctl
socket
(
Socket
, 2550136833, 1) 将套接字的模式改变为允许接收所有数据 顺利完成上面的操作后咱就可以用Recv来接收数据包了,只要不断的调用Recv就OK。
MFC网络编程之自制浏览器
网络编程,当然要用到Windows
Socket
(套接字)技术。
Socket
相关的操作由一系列API函数来完成,比如
socket
、bind、listen、connect、accept、send、sendto、recv、recvfrom等。调用这些API函数有一定的先后次序,有些函数的参数还比较复杂,对于开发者来说,不是很好用。于是,微软的MFC提供了两个类:CAsync
Socket
和C
Socket
,极大地方便了
Socket
功能的使用。 CAsync
Socket
类在较低层次上封装了Windows
Socket
API,并且通过内建一个(隐藏的)窗口,实现了适合Windows应用的异步机制(Windows
Socket
API默认情况下工作在阻塞模式,不方便直接在消息驱动的Windows程序上使用)。C
Socket
类从CAsync
Socket
类派生,进一步简化了
Socket
功能的应用。不过很遗憾,正因为这两个类都内建了一个窗口,它们并不是线程安全的(thread-safe);如果要在多线程环境下应用
Socket
功能,建议自行封装
Socket
API函数。 基于TCP的
socket
编程的服务器端程序流程如下: 1、创建套接字 2、将套接字
绑定
到一个本地
地址
和
端口
号上(bind) 3、将套接字设为监听模式,准备接受客户
请求
(listen) 4、等待客户
请求
,
请求
到来时接受
请求
,建立链接,并返回 一个新的基于此次通信的套接字(accept) 5、用返回的套接字和客户端进行通信(send、recv) 6、返回,等待另一客户
请求
7、关闭套接字 基于TCP的
socket
编程的客户端程序流程如下: 1、创建套接字 2、向服务器端发送
请求
(connect) 3、和服务器端进行通信(send、recv) 4、关闭套接字 基于
UDP
的
socket
编程的服务器端程序流程如下: 1、创建套接字 2、将套接字
绑定
到本地
地址
和
端口
号上(bind) 3、等待接收数据(recvfrom) 4、关闭套接字 基于
UDP
的
socket
编程的客户端程序流程如下: 1、创建套接字 2、和服务器端进行通信(sendto) 3、关闭套接字 异步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式;而同步指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式。 阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用recv()函数读取网络缓冲区
中
的数据,如果没有数据到达,将一直挂在recv()这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区
中
数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发
中
,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。 对于这些概念,初学者的理解也许只能似是而非,我将用一个最简单的
例子
说明异步非阻塞
Socket
的基本原理和工作机制。目的是让初学者不仅对
Socket
异步非阻塞的概念有个非常透彻的理解,而且也给他们提供一个用
Socket
开发网络通信应用程序的快速入门方法。操作系统是Windows 98(或NT4.0),开发工具是Visual C++6.0。 MFC提供了一个异步类CAsync
Socket
,它封装了异步、非阻塞
Socket
的基本功能,用它做常用的网络通信软件很方便。但它屏蔽了
Socket
的异步、非阻塞等概念,开发人员无需了解异步、非阻塞
Socket
的原理和工作机制。因此,建议初学者学习编网络通信程序时,暂且不要用MFC提供的类,而先用
Winsock
2 API,这样有助于对异步、非阻塞
Socket
编程机制的理解。
网络编程
18,356
社区成员
64,217
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章