如何判断socket是否有效

云满笔记 2013-07-31 05:51:02
RT,但是不想丢失任何数据,有的人说用recv可以搞定,可是那样的话可能会recv掉有用数据,好像select可以解决这个问题,可是不知道怎么用,怎么办,如何才能判断一个socket(即int)是否有效呢,前提是不要丢数据,越简单越好,当然可靠性要保障
...全文
635 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MEMEMEMENG 2013-08-04
  • 打赏
  • 举报
回复
我们生成的socket基本都是阻塞的,如果没有连接成功,recv会一直阻塞,select只是告诉你有没有别人联系自己,返回可操作的个数。。。
大尾巴猫 2013-08-04
  • 打赏
  • 举报
回复
成功连接以后,不是在recv就是在send,只能通过这2个函数的返回值判断呀。 如果一半的信息也想要的话,每次recv 1个字节,这样最多损失1个字节的信息。前面的都有。 telnet 就是逐个字节发送或者接受的。
云满笔记 2013-08-04
  • 打赏
  • 举报
回复
看来是没的办法了
云满笔记 2013-08-01
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:

   fd_set fd_r,fd_w;

    struct timeval tvv;

  while(1)
  {
    
        FD_ZERO(&fd_r);
        FD_ZERO(&fd_w);
        FD_SET(lisSock, &fd_r);
        FD_SET(lisSock, &fd_w);
        tvv.tv_sec = 2;
        tvv.tv_usec = 0;

        Ret = select(lisSock + 1, &fd_r, &fd_w, NULL, &tvv);
    
        printf("\n [%s]-[%d]: Ret = %d \n", __func__, __LINE__, Ret);

        acpSock = accept( lisSock, (struct sockaddr *)&clieaddr_in, &socklen);
        if( acpSock < 0)
        {   
            perror("accept");    
            sleep(2);
            continue;
        }   
    
        m_clientNum ++; 
        pthread_t pthreadId;
        pthreadparam *pThreadParam = new pthreadparam;
        pThreadParam->sockFd = acpSock;
        pThreadParam->ClientNO = m_clientNum;   
        pthread_create( &pthreadId, NULL, &clientfuncthread, pThreadParam);
    
    
        printf("\n\n there have %d cliens connect success!\n\n", m_clientNum);

    }   
好早之前写的,select函数只是轮询已有的套接字 是否有准备好的 读 ,写 和 异常 三种状态,
可是我用select返回的都是1,无论是在连接时还是断开时,我应如何确定一个socket是否有效呢,想过用recv可是如果有效的话那数据岂不是白白的接收而丢失掉了
赵4老师 2013-08-01
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
max_min_ 2013-07-31
  • 打赏
  • 举报
回复

   fd_set fd_r,fd_w;

    struct timeval tvv;

  while(1)
  {
    
        FD_ZERO(&fd_r);
        FD_ZERO(&fd_w);
        FD_SET(lisSock, &fd_r);
        FD_SET(lisSock, &fd_w);
        tvv.tv_sec = 2;
        tvv.tv_usec = 0;

        Ret = select(lisSock + 1, &fd_r, &fd_w, NULL, &tvv);
    
        printf("\n [%s]-[%d]: Ret = %d \n", __func__, __LINE__, Ret);

        acpSock = accept( lisSock, (struct sockaddr *)&clieaddr_in, &socklen);
        if( acpSock < 0)
        {   
            perror("accept");    
            sleep(2);
            continue;
        }   
    
        m_clientNum ++; 
        pthread_t pthreadId;
        pthreadparam *pThreadParam = new pthreadparam;
        pThreadParam->sockFd = acpSock;
        pThreadParam->ClientNO = m_clientNum;   
        pthread_create( &pthreadId, NULL, &clientfuncthread, pThreadParam);
    
    
        printf("\n\n there have %d cliens connect success!\n\n", m_clientNum);

    }   
好早之前写的,select函数只是轮询已有的套接字 是否有准备好的 读 ,写 和 异常 三种状态,
云满笔记 2013-07-31
  • 打赏
  • 举报
回复
引用 1 楼 lilin_colin 的回复:
我写个大概吧! select(maxfd+1,&allset,NULL,NULL,NULL); if(FD_ISSET(sockfd,&allset)) { //sockfd有效则执行的代码 }else{ //否则无效执行的代码 }
我试过了,select 和 FD_ISSET 的返回值都是1,没用啊
绯红女王 2013-07-31
  • 打赏
  • 举报
回复
我写个大概吧! select(maxfd+1,&allset,NULL,NULL,NULL); if(FD_ISSET(sockfd,&allset)) { //sockfd有效则执行的代码 }else{ //否则无效执行的代码 }

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧