前言
无论是TCP 客户端 还是UDP客户端,都有可能调用connect去连接远程服务器,下面我们看下TCP Connect 和UDP Connect有哪些区别
UDP 的Connect
在lwIP中UDP Connect声明如下:
err_t udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
UDP Connect的本质是向UDP控制块注册远端服务器的IP地址和端口号。UDP的Connect函数并不涉及任何UDP层的任何数据交互操作,主要原因是UDP面向的是无连接。
UDP Connect更多的在于UDP的多连接上。
基于UDP的无连接,UDP可以给多个IP发送数据包,就是UDP的一对多,这其中有UDP广播和多播通信。
但是UDP的客户端调用connect,当使用了这个方法之后,那么就限定了这个socket的使用范围: 只允许从这个指定的SocketAddress 上获得数据包和向这个指定的SocketAddress 发送数据包, 当你一旦通过这个socket向别的地址发送了数据包,或者接收到了不是这个地址发送来的数据包,那么程序就会抛出IllegalArgumentException 异常, 特殊的是如果指定的这个SocketAddress 是个多播地址或者广播地址,那么只允许向这个地址发送数据包,不允许从这个地址接收数据包。
UDP通过这样的方式,限定了单向的通信,但是注意的是,这里的限定只是仅限于一方,而并没有限制另外一方,另外一方依旧可以向多个IP地址发送数据包的
TCP 的Connect
err_t tcp_connect(struct tcp_pcb * pcb, struct ip_addr * ipaddr,u16_t port, err_t (* connected)(void * arg,struct tcp_pcb * tpcb,err_t err));
我们来看下lwIP Wiki是怎么说的:
Sets up the pcb to connect to the remote host and sends the initial SYN segment which opens the connection. If the connection has not already been bound to a local port, a local port is assigned to it.
The tcp_connect() function returns immediately; it does not wait for the connection to be properly setup. Instead, it will call the function specified as the fourth argument (the "connected" argument) when the connection is established. If the connection could not be properly established, either because the other host refused the connection or because the other host didn't answer, the error handling function will be called with an the "err" argument set accordingly.
大概说的是:TCP Connect会触发TCP的三次握手,会向远程主机发送SYN请求建立连接,connect是非阻塞的,调用以后会立马返回,而不管连接是否建立,如果连接建立了connected函数就会被调用,如果连接没有建立,就返回err,对应的error回调函数会被调用。
小结
- TCP是面向连接的 Connect只可以进行一次,Connect会触发TCP的三次握手,connect建立以后就基于这条连接进行数据交互。
- UDP是无连接的 Connect()可以调用多次, Connect并不会触发UDP层的数据交互,每次调用Connect实际上限定了UDP的单向连接。