UDP的Connect和TCP的Connect有什么不同?
推荐于2016-02-19
展开全部
1、UDP中可以使用connect系统调用。
2、UDP中connect操作与TCP中connect操作有着本质区别。‘
TCP中调用connect会引起三次握手,client与server建立连结。
UDP中调用connect内核仅仅把对端ip&port记录下来。
3、UDP中可以多次调用connect,TCP只能调用一次connect。
2、UDP中connect操作与TCP中connect操作有着本质区别。‘
TCP中调用connect会引起三次握手,client与server建立连结。
UDP中调用connect内核仅仅把对端ip&port记录下来。
3、UDP中可以多次调用connect,TCP只能调用一次connect。
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
展开全部
楼上完全错误!
UDP 的 Connect 大有学问。
表面来看是 绑定 ip,port , 然后可以 read/write 发送,接收数据包。
更有意义是 Connect 绑定之后Udp, 内核在收到由于Udp引起的ICMP错误报文的时候,比如
icmp port unreachable(说明udp目的地址不存在),这个时候内核会记住这个udp错误,再下一次
调用write/send 的时候 返回 错误,保存errno(111 Connection refused) . 只是举个例子,Udp相关的icmp错误报文不止这一种。
可以看看netcat 的代码,其中扫描udp端口的时候就是用的这个方法,比较有意思的是,nc的作者在两次write(s,"\0",1)的中间插入了一个毫无关系的 tcp connect代码, 其目的是等待第一个发出的udp报文的目的server 返回ICMP报文。 (还有,nc扫描端口的代码可以优化为write(s,"\0",0) ,可以查看UDP rfc, udp是允许发送空报文的,ip头20字节,udp头8字节 ,然后就是空了)
UDP 的 Connect 大有学问。
表面来看是 绑定 ip,port , 然后可以 read/write 发送,接收数据包。
更有意义是 Connect 绑定之后Udp, 内核在收到由于Udp引起的ICMP错误报文的时候,比如
icmp port unreachable(说明udp目的地址不存在),这个时候内核会记住这个udp错误,再下一次
调用write/send 的时候 返回 错误,保存errno(111 Connection refused) . 只是举个例子,Udp相关的icmp错误报文不止这一种。
可以看看netcat 的代码,其中扫描udp端口的时候就是用的这个方法,比较有意思的是,nc的作者在两次write(s,"\0",1)的中间插入了一个毫无关系的 tcp connect代码, 其目的是等待第一个发出的udp报文的目的server 返回ICMP报文。 (还有,nc扫描端口的代码可以优化为write(s,"\0",0) ,可以查看UDP rfc, udp是允许发送空报文的,ip头20字节,udp头8字节 ,然后就是空了)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
UDP协议不是面向连接的协议,所以没有connect吧。
UDP相关的socket api只有bind sendto recvfrom!
希望可以帮到您,还有什么疑问可以追问!
UDP相关的socket api只有bind sendto recvfrom!
希望可以帮到您,还有什么疑问可以追问!
参考资料: 本人是做socket编程多年的程序员,有什么问题您可以尽管问,本人一定知无不言!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
udp中也有connect的,只是它的connect不会进行三次握手。udp中调用connect时什么包也不会发送,不像TCP的时候会进行三次握手。
udp调用connect后就可以使用send recv来进行UDP的收发包,而不必每次都要指定地址,然后使用sendto recvfrom进行操作,当然也可以调用sendto recvfrom。
udp调用connect后就可以使用send recv来进行UDP的收发包,而不必每次都要指定地址,然后使用sendto recvfrom进行操作,当然也可以调用sendto recvfrom。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一、UDP的connect函数,并不进行3次握手机制,而仅仅是指定了目的ip和port而已。对于已经connect过的套接口
(1)不能再使用sendto或recvfrom函数,因为connect已经指定ip和port,所以只能用write和read函数。
(2)UDP中,connect可以多次使用,也可以断开connect后重新指定ip和port。。设置地址族为AF_UNSPEC,再调用 connect,则可以断开此接口。
实际上,sendto的操作即是循环 连接套接口,输出数据,关闭套接口 这3个动作的。
(3)一个socket只能connect一个目的主机。仅在进程用udp套接口与确定的唯一对方进行通信时,才调用connect。
二、
UDP中 ,长度为0的数据包是可以发送的,会生成一个包含IP头部(ipv4-20字节,ipv6-40字节),和8字节UDP头部,以及没有数据的 IP数据包,recvfrom返回0。
所以,当recvfrom返回0,并不意味着对方关闭了连接。实际上,UDP本来就没有连接可言。
TCP服务器一般是并发多进程的,UDP服务器一般是迭代的 。。
如果服务端进程未开启,那么客户端往其发送udp数据包时,会返回ICMP不可到达错误,但是这个错误一般不返回到客户端进程,因为ICMP不可到达错误是异步错误,如果客户端发送多个UDP,其中一个返回错误,内核是无法判断这个错误属于哪个数据包的。
只有当客户端使用connect与服务端建立unp连接时,ICMP不可到达错误才会返还给客户端进程,具体地说是在客户端recv或者read时读取到这个 ICMP错误。
#include<unp.h>
int main(int argc, char **argv) {
struct sockaddr_in ser;
int fd;
char str[20];
bzero(&ser, sizeof(struct sockaddr_in));
ser.sin_family=AF_INET;
ser.sin_port=htons(9877);
inet_pton(AF_INET, "127.0.0.1", &ser.sin_addr);
fd=socket(AF_INET, SOCK_DGRAM, 0);
if (connect(fd, (struct sockaddr *)&ser, sizeof(struct sockaddr_in))<0)
perror("connect:");
if (sendto(fd, "ok", 3, 0, (struct sockaddr*)&ser, sizeof(struct sockaddr_in))<0)
perror("sendto:");
if (recvfrom(fd, str, 10, 0, NULL, NULL)<0)
perror("recvfrom:");
}
如果服务器未开启的话,那么会有如下输出 recvfrom:: Connection refused
而如果没有connect进行udp连接的话,那么进程就会一直阻塞在recvfrom。。。
(1)不能再使用sendto或recvfrom函数,因为connect已经指定ip和port,所以只能用write和read函数。
(2)UDP中,connect可以多次使用,也可以断开connect后重新指定ip和port。。设置地址族为AF_UNSPEC,再调用 connect,则可以断开此接口。
实际上,sendto的操作即是循环 连接套接口,输出数据,关闭套接口 这3个动作的。
(3)一个socket只能connect一个目的主机。仅在进程用udp套接口与确定的唯一对方进行通信时,才调用connect。
二、
UDP中 ,长度为0的数据包是可以发送的,会生成一个包含IP头部(ipv4-20字节,ipv6-40字节),和8字节UDP头部,以及没有数据的 IP数据包,recvfrom返回0。
所以,当recvfrom返回0,并不意味着对方关闭了连接。实际上,UDP本来就没有连接可言。
TCP服务器一般是并发多进程的,UDP服务器一般是迭代的 。。
如果服务端进程未开启,那么客户端往其发送udp数据包时,会返回ICMP不可到达错误,但是这个错误一般不返回到客户端进程,因为ICMP不可到达错误是异步错误,如果客户端发送多个UDP,其中一个返回错误,内核是无法判断这个错误属于哪个数据包的。
只有当客户端使用connect与服务端建立unp连接时,ICMP不可到达错误才会返还给客户端进程,具体地说是在客户端recv或者read时读取到这个 ICMP错误。
#include<unp.h>
int main(int argc, char **argv) {
struct sockaddr_in ser;
int fd;
char str[20];
bzero(&ser, sizeof(struct sockaddr_in));
ser.sin_family=AF_INET;
ser.sin_port=htons(9877);
inet_pton(AF_INET, "127.0.0.1", &ser.sin_addr);
fd=socket(AF_INET, SOCK_DGRAM, 0);
if (connect(fd, (struct sockaddr *)&ser, sizeof(struct sockaddr_in))<0)
perror("connect:");
if (sendto(fd, "ok", 3, 0, (struct sockaddr*)&ser, sizeof(struct sockaddr_in))<0)
perror("sendto:");
if (recvfrom(fd, str, 10, 0, NULL, NULL)<0)
perror("recvfrom:");
}
如果服务器未开启的话,那么会有如下输出 recvfrom:: Connection refused
而如果没有connect进行udp连接的话,那么进程就会一直阻塞在recvfrom。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询