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

C++代码
  1. if (connect(sockFD,  
  2.             (sockaddr*)&remoteSockAddr,  
  3.             sizeof(remoteSockAddr)) < 0) {  
  4.     sockClass::error_info("connect() failed.");  
  5. }  

       建立连接后的UDP RecvQ就不会将非来自remoteSockAddr的数据包收入。

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

       如果希望断开UDP的连接,需要使用一个特定的“断开”地址,代码如下:

C++代码
  1. sockaddr descon_sock_addr;  
  2. memset(&descon_sock_addr, 0, sizeof(descon_sock_addr));  
  3. descon_sock_addr.sa_family = AF_UNSPEC;  
  4. if (connect(sockFD,  
  5.              &descon_sock_addr,  
  6.              sizeof(descon_sock_addr)) < 0) {  
  7.      sockClass::error_info("des connect() failed.");  
  8. }  

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

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.jizhuomi.com/software/469.html
2015年11月26日
作者:鸡啄米 分类:软件开发 浏览: 评论:0