# wsock.udp.asyncClient 库模块帮助文档

## udpAsyncClientObject 成员列表 <a id="udpAsyncClientObject" href="#udpAsyncClientObject">&#x23;</a>

### udpAsyncClientObject.asyncSelect(event,userMsgId,hwnd) <a id="udpAsyncClientObject.asyncSelect" href="#udpAsyncClientObject.asyncSelect">&#x23;</a>
检测到由event参数指明的网络事件后,  
事件到达向hwnd指定句柄的窗口发送userMsgId消息,  
第二次调用此函数可省略句柄以及消息ID  

失败返回null,以及错误信息,  
成功返回true,以及上次调用此函数指定的event参数

### udpAsyncClientObject.bind <a id="udpAsyncClientObject.bind" href="#udpAsyncClientObject.bind">&#x23;</a>
绑定 IP 端口。

### udpAsyncClientObject.bind(IP,端口) <a id="udpAsyncClientObject.bind" href="#udpAsyncClientObject.bind">&#x23;</a>
绑定 IP 端口。  
如果不指定 IP 则默认获取内网 IP 作为参数。  

成功返回 true，  
失败返回 null,错误信息,错误代码。  

相同的本地 IP 与端口重复绑定会返回 10022（_WSAEINVAL） 错误。

### udpAsyncClientObject.close() <a id="udpAsyncClientObject.close" href="#udpAsyncClientObject.close">&#x23;</a>
关闭 UDP 客户端。  
如果未显式调用此函数，在对象析构时,将会自动调用。  

已关闭的套接字不能再使用。  
就好比用过的车票不能重复用，什么地方都有规则和限制。

### udpAsyncClientObject.connect(IP或域名,端口号) <a id="udpAsyncClientObject.connect" href="#udpAsyncClientObject.connect">&#x23;</a>
连接指定的目标 IP 以及端口号。  
省略参数则使用此对象上次使用的目标地址。

### udpAsyncClientObject.getLocalIp() <a id="udpAsyncClientObject.getLocalIp" href="#udpAsyncClientObject.getLocalIp">&#x23;</a>
返回本机 IP，端口

### udpAsyncClientObject.getRemoteAddress() <a id="udpAsyncClientObject.getRemoteAddress" href="#udpAsyncClientObject.getRemoteAddress">&#x23;</a>
最后最后发送或接收的 sockaddr_in 结构体  

[返回对象:sockaddrInObject](#sockaddrInObject)

### udpAsyncClientObject.getRemoteIp() <a id="udpAsyncClientObject.getRemoteIp" href="#udpAsyncClientObject.getRemoteIp">&#x23;</a>
返回最后发送或接收的 IP ,端口

### udpAsyncClientObject.getopt(_SO) <a id="udpAsyncClientObject.getopt" href="#udpAsyncClientObject.getopt">&#x23;</a>
获取选项  
参数 @1 使用 _SO_ 前缀的常量指定选项,参数 @2 使用结构体指定值  
如果不指定参数 @2 ,则获取一个32位整型数值,  
可选用参数@3指定设置层次，默认为SOL_SOCKET  
成功返回读取的结构体

### udpAsyncClientObject.joinGroup(广播组IP地址,网络接口IP) <a id="udpAsyncClientObject.joinGroup" href="#udpAsyncClientObject.joinGroup">&#x23;</a>
加入广播组  
参数 @2 可省略

### udpAsyncClientObject.leaveGroup(广播组IP地址,网络接口IP) <a id="udpAsyncClientObject.leaveGroup" href="#udpAsyncClientObject.leaveGroup">&#x23;</a>
退出广播组  
参数 @2 可省略

### udpAsyncClientObject.recv(最大接收长度) <a id="udpAsyncClientObject.recv" href="#udpAsyncClientObject.recv">&#x23;</a>
接收数据包。  
如果参数不指定长度，则使用 bufferSize 指定的长度。  
成功返回字符串,  
失败返回 null,错误代码  

与 recvfrom 方法的区别是此函数不会接收并存储远程客户端的 IP地址与端口。

### udpAsyncClientObject.recvfrom(缓冲区长度) <a id="udpAsyncClientObject.recvfrom" href="#udpAsyncClientObject.recvfrom">&#x23;</a>
接收数据并获取远程客户端地址。  
如果获取到非空数据则返回 3 个值：数据,IP,端口 。  
此函数会更新并存储最后发送与接收的远程客户端地址。

### udpAsyncClientObject.reuseAddress(true) <a id="udpAsyncClientObject.reuseAddress" href="#udpAsyncClientObject.reuseAddress">&#x23;</a>
是否允许端口重用

### udpAsyncClientObject.send(数据,长度) <a id="udpAsyncClientObject.send" href="#udpAsyncClientObject.send">&#x23;</a>
调用 connect 以后可以使用此函数接收数据包发送数据包

### udpAsyncClientObject.sendto(发送数据,IP或域名,端口号) <a id="udpAsyncClientObject.sendto" href="#udpAsyncClientObject.sendto">&#x23;</a>
发送数据，IP端口号为可选参数,  
成功返回 true

### udpAsyncClientObject.setBroadcast(true) <a id="udpAsyncClientObject.setBroadcast" href="#udpAsyncClientObject.setBroadcast">&#x23;</a>
允许广播

### udpAsyncClientObject.setInterval(回调函数,延时毫秒数,...) <a id="udpAsyncClientObject.setInterval" href="#udpAsyncClientObject.setInterval">&#x23;</a>

```aardio
udpAsyncClientObject.setInterval(回调函数,延时毫秒数,...setInterval(   
	function(){  
		/*参数 @1 指定执行函数,参数 @2 指定执行间隔，  
可选指定一个或多个回调参数，不指定回调参数则默认为:  
 hwnd,message,timerId,tick,  

如果在定时器中执行了 win.delay 等继续消息循环的代码，  
在定时器退出前不会再触发同一定时器（重入）。  

定时器回调函数无返回值、返回 null 或 true 则继续运行。  
返回 false,0，或用 tonumber 可转换为 0 的值则清除此定时器。  
返回可用 tonumber 转换为非 0 数的值则修改定时器执行间隔（毫秒）*/  
	},1000  
)
```

### udpAsyncClientObject.setMulticastInterface() <a id="udpAsyncClientObject.setMulticastInterface" href="#udpAsyncClientObject.setMulticastInterface">&#x23;</a>
设置组播网卡 IP，不指定参数自动取网卡IP

### udpAsyncClientObject.setMulticastLoopback(true) <a id="udpAsyncClientObject.setMulticastLoopback" href="#udpAsyncClientObject.setMulticastLoopback">&#x23;</a>
是否启用多播回送

### udpAsyncClientObject.setMulticastTtl() <a id="udpAsyncClientObject.setMulticastTtl" href="#udpAsyncClientObject.setMulticastTtl">&#x23;</a>
设置组播报文的数据包的TTL

### udpAsyncClientObject.setTimeouts(发送超时,接收超时) <a id="udpAsyncClientObject.setTimeouts" href="#udpAsyncClientObject.setTimeouts">&#x23;</a>
设置超时,以亳秒为单位( 1 秒为 1000 毫秒)

### udpAsyncClientObject.setopt(_SO) <a id="udpAsyncClientObject.setopt" href="#udpAsyncClientObject.setopt">&#x23;</a>
设置选项  
参数 @1 使用 _SO_ 前缀的常量指定选项,参数 @2 使用结构体、数值、布尔值都可以  
可选用参数@3指定设置层次，默认为SOL_SOCKET  
成功返回true

## udpAsyncClientObject 事件列表 <a id="udpAsyncClientObjectEvent" href="#udpAsyncClientObjectEvent">&#x23;</a>

### udpAsyncClientObject.onReceive <a id="udpAsyncClientObject.onReceive" href="#udpAsyncClientObject.onReceive">&#x23;</a>

```aardio
udpAsyncClientObject.onReceive = function(err){
	var str = udpServer.recvfrom(1024);/*收到数据*/	
}
```

## wsock.udp 成员列表 <a id="wsock.udp" href="#wsock.udp">&#x23;</a>

### wsock.udp.asyncClient <a id="wsock.udp.asyncClient" href="#wsock.udp.asyncClient">&#x23;</a>
UDP 异步客户端

### wsock.udp.asyncClient() <a id="wsock.udp.asyncClient" href="#wsock.udp.asyncClient">&#x23;</a>
创建 UDP 异步客户端。  
此对象可传入其他线程（仅共享 UDP 套接字，接收线程调用 close 方法不会关闭套接字）。  

[返回对象:udpAsyncClientObject](#udpAsyncClientObject)
