当前位置:  技术问答>linux和unix

使用TCP,在客户端怎么知道建立好的连接已经断开?怎么用非阻塞模式,以及怎么知道socket已经收到数据并立即将数据读出?

    来源: 互联网  发布时间:2015-12-06

    本文导语:  谢谢 | 你所有问题的答案是select 或pselect 调用。 下面是我的程序一段,为你摘录出来主体。 这是发送,看socket是否可以发送,可以则发送,不可以则尝试直到ntimeout秒后。         fd_set...

谢谢

|
你所有问题的答案是select 或pselect 调用。
下面是我的程序一段,为你摘录出来主体。

这是发送,看socket是否可以发送,可以则发送,不可以则尝试直到ntimeout秒后。
        fd_set wfds;
        FD_ZERO(&wfds);
        FD_SET(socket,&wfds);
        struct timeval tmout;
        tmout.tv_sec=ntimeout;
        tmout.tv_usec=0;
        int nselect=select(1024,NULL,&wfds,NULL,&tmout);
        if(nselect==-1)
        {
  //select调用错误,报告错误,一般通过errno
        }
        else if(nselect)
        {
                //可写进行发送(网络物理和传输链路OK)
                int sret;
                sret=send(socket,....);
                if(sret==-1){
                    //Send出错,检查或报告错误,一般通过errno
                }

        }
        else
        {
                //不可写,连接问题,检查或报告错误,一般通过errno
                shutdown(socket,SHUT_RDWR);
                close(socket);
        }


这是接收部分,同发送过程基本相同,除了rfds的位置。
        fd_set rfds;
        FD_ZERO(&rfds);
        FD_SET(socket,&rfds);
        struct timeval tmout;
        tmout.tv_sec=ntimeout;
        tmout.tv_usec=0;
        int nselect=select(1024,&rfds,NULL,NULL,&tmout);
        if(nselect==-1)
        {
  //select调用错误,报告错误,一般通过errno
        }
        else if(nselect)
        {
                //可读,进行接收(网络物理和传输链路OK,且有income数据)
                int sret;
                sret=recv(socket,....);
                if(sret==-1){
                    //recv出错,检查或报告错误,一般通过errno
                }

        }
        else
        {
                //不可读,连接问题或无数据可读,检查或报告错误,一般通过errno
                shutdown(socket,SHUT_RDWR);
                close(socket);
        }

如果你想connect时使用异步模式(看是否可以连接,否则超时退出),基本同send过程,用select询问是否可写即可。因为connect过程基本就是先send SYN到服务器,然后接收SYN+ACK,然后再发ACK

|
三个问题:
1。使用TCP,在客户端怎么知道建立好的连接已经断开?
read返回0
2。怎么用非阻塞模式?
fcntl()
3。以及怎么知道socket已经收到数据并立即将数据读出?
可以用select,也可以用阻塞或非阻塞read. 在linux下对tcp socket来说你可以把它当成一个流文件看。

|
要想“立即”(当然也是相当而言)知道一个连接已经断开,可以使用心跳函数。
如果不关心时效性,则客户端在第二次写已断开的socket的时候会产生EPIPE。
你所有的这些问题在《unix网络编程》卷一中都有答案,你不妨找来看一下。

|
我的blog上有一个epoll的例子
http://blog.chinaunix.net/u/1574/showart.php?id=31992

|
int set_fd(int fd)
{
int flag;
if(flag=fcntl(fd,F_GETFL)

    
 
 

您可能感兴趣的文章:

  • 在Python3中使用urllib实现http的get和post提交数据操作
  • 大家在UNIX下都使用什么数据库?使用什么做数据开发?
  • mysql数据库下载安装教程和使用技巧
  • 如何使用jsp显示数据库中的数据?
  • mongodb 数据库常用命令使用实例
  • 请教高高手:如何规划和创建数据池?并使用数据池?有资料也行
  • 请教在linux系统开发环境下,有没有db和dbf数据库引擎,如何使用这个数据库?
  • 使用php语句将数据库*.sql文件导入数据库
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • UNIX下面能否使用类似BCP的程序连接另一台UNIX下面的Sybase数据库进行数据处理
  • 使用jquery局部刷新(jquery.load)从数据库取出数据
  • 收缩后对数据库的使用有影响吗?
  • 当发布的程序中含有数据库的使用时,...?
  • oracle数据库删除数据Delete语句和Truncate语句的使用比较
  • 如何强制删除或恢复SQLServer正在使用的数据库
  • 一个数据库函数的使用?
  • 我时用jdbc打开数据库,使用后是否要显示的关闭数据库,还是等java的垃圾回收器来处理。
  • 超级菜鸟问题:使用VMware安装linux会删除硬盘上的数据吗?
  • 嵌入式linux下数据库使用
  • 请教数据库连接池的使用....
  • 关于数据报套接字的使用
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 弱智问题:我们怎么才知道要使用的方法需要实现什么接口才能使用这个方法呢?
  • 我想在linux下开发软件,但不知道使用什么语言好,和使用什么开发工具
  • Linux下如何知道有哪些端口未被使用??
  • 菜鸟问题,小弟刚刚使用LINUX不久,不知道如何使用编程工具进行编译和运行!
  • 我用的是红帽5 我想知道我LINUX下的KDbg的使用方法
  • 使用JDBC,用什么方法可以知道MYSQL中有几个库,每个库有几个表?
  • 如何 在linux 下使用 pvm 请高手指导 不知道的也来学习!
  • 怎样知道linux的哪些端口被使用
  • 怎样知道当前使用的是什么shell?
  • 我是一个linux新手,不知道如何在linux进行C语言的编写和使用?
  • 如果我使用或者覆盖了一个不鼓励使用的API,会有什么后果,我怎么知道那些API不鼓励覆盖?
  • 请问:使用RMI的时候如何知道对方的IP地址?(zhoudan)
  • 谁能告诉我,怎样知道我所使用的机器安装了几个cpu(用c程序)
  • 不知道为什么,smb服务无法使用?(在线等)
  • 各位,有没有人知道光电鼠在linux下使用是否有啥问题?
  • 怎么才能知道当前正在使用的linux的版本名和版本号??
  • 有没有办法知道系统中那些文件描述符正在被使用?
  • 能否根据rootfs的image知道它使用的是何种文件系统?
  • linux下用gdb调试程序感觉非常不方便,不知道大家使用的什么工具进行调试的呀?
  • 如何知道现在正在使用KDE还是正在使用GNOME?
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • Office 2010 Module模式下使用VBA Addressof
  • c#中SAPI使用总结——SpVoice的使用方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3