socket 编程入门教程(五)UDP原理:4、“有连接”的UDP

本文深入探讨了UDP套接字如何通过connect()函数与远程套接字建立连接,以及如何使用特定的断开地址来实现断开连接。解释了这种连接方式改变了UDP接收数据包的过滤机制,不再接收非连接地址的数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然UDP是无连接的,但是也可以通过调用connect()将本地的UDP socket FD与一个远程的UDP socket FD连接起来——只需要指定这个远程sockFD的地址,假设这个地址是sockaddr_in remoteSockAddr,代码如下:

    if (connect(sockFD,
                (sockaddr
*)&remoteSockAddr,
                
sizeof(remoteSockAddr)) < 0) {
        sockClass::error_info(
"connect() failed.");
    }

建立连接后的UDP RecvQ就不会将非来自remoteSockAddr的数据包收入。
请注意UDP的connect()与TCP的connect()很不相同,TCP是连接服务器的监听socket,并且会阻塞直到服务器调用accept()。一般的说法,UDP的连接并不会改变UDP的各种特点,比如,即使连接,UDP也不知道远程主机是否在线连接或者是否断开——但是,我个人认为,改变了本机的RecvQ接收数据包的过滤机制,也就改变了UDP原本可以接收来自任何地址信息的属性。
如果希望断开UDP的连接,需要使用一个特定的“断开”地址,代码如下:

    sockaddr descon_sock_addr;
    memset(
&descon_sock_addr, 0sizeof(descon_sock_addr));
    descon_sock_addr.sa_family 
= AF_UNSPEC;
    
if (connect(sockFD,
                
&descon_sock_addr,
                
sizeof(descon_sock_addr)) < 0) {
        sockClass::error_info(
"des connect() failed.");
    }

请注意这里的地址族AF_UNSPEC直接赋值给了一个sockaddr结构。我试过,使用sockaddr_in也是可以的,但是无论是哪个结构,首先都得将整个结构对象清零,否则可能报错。


转载于:https://my.oschina.net/GeorgeSu/blog/264212

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值