CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  网络及通讯开发

recvfrom()消息的接收问题

楼主Alaylm(Alaylm)2006-05-01 17:02:33 在 C++ Builder / 网络及通讯开发 提问

关于这个recvfrom()函数,现在是不知道什么时候该用它来读取消息,  
  我在BCB下做个聊天的软件,不想用控件,所以就没有事件了,那么什么时候来让客户端接收消息呢?  
  不能用按钮来读取吧,  
  我是新手,请求帮助,苦思好几天了,嘿嘿,  
   
  问题点数:20、回复次数:7Top

1 楼pp616(坏蛋)回复于 2006-05-01 20:15:22 得分 5

recvfrom就在等了。Top

2 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-01 21:17:22 得分 15

想不到大伙五一不休息呀。  
   
  楼主的问题有几种答案:  
  一:windows特有的事件驱动IO,通过调用WSA*函数来完成  
  二:通过多路复用技术来完成,调用select函数完成  
  三:启动一个线程,一直接收(调用recvfrom),一般这个socket是阻塞式的,所以如果没有数据到来时,这个调用会休眠,并不会占用多少CPU资源。  
   
  先说这么多了,有人抢我机器用,嘿嘿Top

3 楼Alaylm(Alaylm)回复于 2006-05-01 21:45:05 得分 0

真是谢谢哥哥们了,大家这么热心我没在,我在陪个朋友,对不起大家了,select()我也想过,看是没用成功,不知道哪里弄错了,反回来的都是-1  
  事件驱动到是不错哦,能在仔细说说么,  
  因为BCB的事件为先吧,比如说我在form2的close()中使用这个recvfrom   这个函数吧,得等这个函数接到消息后,才能实现Form2的close()所以有点不太和用,Top

4 楼Alaylm(Alaylm)回复于 2006-05-01 21:45:50 得分 0

recvfrom我知道它在等啊,但是我改怎么什么时候让它等呢Top

5 楼Alaylm(Alaylm)回复于 2006-05-01 21:47:25 得分 0

有没有不让recvfrom不是阻塞的呢,让time控件时时查询,嘿嘿,最笨的方法了吧,希望大哥们能多指点,苦死我了。Top

6 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-02 06:54:26 得分 0

1、关于select的使用,是有点小复杂,我找找看有没有现成的资料贴上来。  
   
  2、至于什么时候让它等,很简单,开一个线程不断调用它,是个死循环(除非线程结束)。每时每刻都在等。  
   
  3、recvfrom可以是非阻塞,也可以通过调用函数得知是否有数据来临,这个我记不清那个函数了。还有,如果你想用定时调用,也可以试试Top

7 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-02 06:57:43 得分 0

TCP/IP编程基础——超时、多路复用、非阻塞      
     
  作者:baoyuhua   时间:2003-02-23   11:11   出处:互联网   责编:chinaitpower      
     
                              摘要:TCP/IP编程基础——超时、多路复用、非阻塞    
          在TCP连接中,recv等函数默认为阻塞模式(block),即直到有数据到来之前函数不会返回,而我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()函数:  
          int     setsockopt(int     s,   int   level,   int   optname,   void*   optval,   socklen_t*   optlen);  
          这里我们要涉及到一个结构:  
          struct   timeval  
          {  
                          time_t   tv_sec;  
                          time_t   tv_usec;  
          };  
          这里第一个域的单位为秒,第二个域的单位为微秒。  
          struct   timeval   tv_out;  
          tv_out.tv_sec   =   1;  
          tv_out.tv_usec   =   0;  
          填充这个结构后,我们就可以以如下的方式调用这个函数:  
          setsockopt(fd,   SOL_SOCKET,   SO_RCVTIMEO,   &tv_out,   sizeof(tv_out));(具体参数可以man一下,或查看MSDN)  
          这样我们就设定了recv()函数的超时机制,当超过tv_out设定的时间而没有数据到来时recv()就会返回0值。  
   
          第二个我们要介绍的是多路复用机制,也就是同时监听多个套接字连接。  
          int   select(int   n,   fd_set*   readfds,   fd_set*   writefds,   fd_set*   exceptfds,   struct   timeval*   timeout);  
          这里涉及到了fd_set结构:  
          typedef   struct   fd_set  
          {  
                          u_int   fd_count;  
                          int   fd_array[FD_SETSIZE];  
          }  
          fd_count为fd_set结构中包含的套接字个数,fd_array唯一个int   数组,包含了我们要监听的套接字。  
          首先我们需要使用FD_SET将我们要监听的套接字添加到fd_set结构中:  
          fd_set   readfd;  
          FD_SET(fd,   &readfd);  
          然后我们这样调用select函数:  
          select(max_fd   +   1,   &readfd,   NULL,   NULL,   NULL);(具体参数可以man一下,或查看MSDN)  
          FD_ISSET(fd,   &readfd);  
          其中max_fd为我们要监听的套接字中值最大的一个,同时在调用select是要将其加1,readfd即为我们监听的要进行读操作的套接字连接,第三个参数是我们监听的要进行写操作的套接字连接,第四个参数用于异常,而最后一个参数可以用来设定超时,这里同样使用了struct   timeval结构,可以实现与前面介绍的同样的效果。这里如果连接进来的话select即返回一个大于零的值,然后我们调用FD_ISSET宏来检测具体是那一个套接字有数据进来(FD_ISSET返回非零值)。  
   
          最后介绍的是另一种实现非阻塞的方法,这种方法在有些应用中会起到一定作用,尤其是在select()函数监听的套接字个数超过1024个时(因为fd_set结构在大部分UNIX系统中都对其可以监听的套接字个数作了1024的限制,如果要突破这个限制,必须修改头文件并重新编译内核),我们就不能使用select多路复用机制。  
          拿recv()函数来说,我们可以这样进行调用:  
          recv(fd,   buf,   sizeof(buf),   MSG_DONTWAIT);  
          注意到我们这里采用了MSG_DONTWAIT标志,它的作用是告诉recv()函数如果有数据到来的话就接受全部数据并立刻返回,没有数据的话也是立刻返回,而不进行任何的等待。采用这个机制就可以在多于1024个套接字连接时使用for()循环对全部的连接进行监听。  
   
          以上介绍的几点的具体使用方法可以参照我前面的两篇贴子。  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:Alaylm
  • pp616
  • xpdavis

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo