随笔 - 96  文章 - 255  trackbacks - 0
<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

E-mail:zbln426@163.com QQ:85132383 长期寻找对战略游戏感兴趣的合作伙伴。

常用链接

留言簿(21)

随笔分类

随笔档案

SDL相关网站

我的个人网页

我的小游戏

资源下载

搜索

  •  

积分与排名

  • 积分 - 476784
  • 排名 - 36

最新评论

阅读排行榜

评论排行榜

虽然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也是可以的,但是无论是哪个结构,首先都得将整个结构对象清零,否则可能报错。
posted on 2010-06-11 11:51 lf426 阅读(2107) 评论(0)  编辑 收藏 引用 所属分类: SDL入门教程socket 编程入门教程

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理