当前位置: 首页 > news >正文

linux下socket常见问题整理

1. socket不能立即关闭的问题

每次修改了源代码并再次编译运行时,常遇到下面的错误:

Cann't bind server socket !
Address already in use

解决方法为使用setsockopt函数设置SO_REUSEADDR,示例代码如下:

int reuse = 0;
struct sockaddr_in cliaddr, servaddr;
listenfd = socket(PF_INET, SOCK_STREAM,0);
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
    perror("setsockopet error\n");
    return -1;
}

2. 关于tcp客户端非正常掉线的问题

开启探测属性,在一段时间内没有数据往来,则发送探测包,若探测包收得不到响应,则重发一定次数,若还未得到响应则认为链路断开,示例代码如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>

int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
ioctl(s, FIONBIO, &non_blocking);/*设置非堵塞*/

3. socket客户端关闭检测

方式1:当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开,示例代码:

if(FD_ISSET(net->desfd,&tempset)) {
    char recvbuf[1024] = {0};
    int ret = read(net->desfd, recvbuf, 1024);
    if (ret == -1)
        ERR_EXIT("readline error");
    else if (ret == 0) { //客户端关闭
        printf("client %d close \n",net->desfd);
        FD_CLR(net->desfd, &mset);
        client[i] = -1;
        close(net->desfd);
    }
}

方式2:用getsockopt来判断,示例代码:

#include <linux/types.h>
#include <asm/byteorder.h>
#include <linux/config.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <net/sock.h>

int SocketConnected(int sock)
{
    if (sock <= 0)
        return 0;
    struct tcp_info info;
    int len = sizeof(info);
    getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *) & len);
    if ((info.tcpi_state == TCP_ESTABLISHED)) {
        //myprintf("socket connected\n"); 
        return 1;
    } else {
        //myprintf("socket disconnected\n"); 
        return 0;
    }
}

4. 关于指定客户端ip的问题

对于服务器来说,设置指定ip地址的访问,主要是通过accept函数返回的客户端的ip和端口号来判断,若不是所设定的则进行关闭操作。

客户端在连接时,也可指定自己的ip地址(同服务器),在connet连接之前通过bind绑定。

cln->srcaddr.sin_family = AF_INET;
cln->srcaddr.sin_port = htons(5555);
cln->srcaddr.sin_addr.s_addr = inet_addr("192.166.0.222");
bind(cln->srcfd, (struct sockaddr *)&(cln->srcaddr), sizeof(cln->srcaddr))

相关文章:

  • 奇偶校验的原理
  • CRC循环冗余校验原理
  • ceph基本环境搭建 使用cephadm
  • ceph-deploy常见问题处理
  • 解决linux下程序运行时无法找到动态库的问题error while loading shared libraries
  • Qt样式表的使用setStyleSheet
  • Qt实现关闭主/父窗口后同时关闭其他窗口的方法事件过滤器(eventFilter)的使用
  • StartUML4.0.1的使用方法
  • 结构型模式--Proxy代理模式
  • C++的Lambda表达式的用法
  • 微信小程序学习之rich-text的嵌入静态HTML
  • 微信小程序CSS Flexbox(弹性盒子)布局模块
  • 语义化版本 2.0.0 -- 如何使用软件版本号
  • 微信小程序css之盒子(box)模型
  • 微信小程序中text标签换行问题
  • [译]如何构建服务器端web组件,为何要构建?
  • 【node学习】协程
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Consul Config 使用Git做版本控制的实现
  • ES10 特性的完整指南
  • ES6系列(二)变量的解构赋值
  • java 多线程基础, 我觉得还是有必要看看的
  • Js基础知识(四) - js运行原理与机制
  • LeetCode18.四数之和 JavaScript
  • linux学习笔记
  • Promise面试题2实现异步串行执行
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 前端面试之CSS3新特性
  • 如何合理的规划jvm性能调优
  • 微服务核心架构梳理
  • #{} 和 ${}区别
  • $(function(){})与(function($){....})(jQuery)的区别
  • (Python) SOAP Web Service (HTTP POST)
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)JAVA使用POI操作excel
  • (四)Linux Shell编程——输入输出重定向
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)VC++中ondraw在什么时候调用的
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET 5种线程安全集合
  • .NET MVC第三章、三种传值方式
  • .NET 中什么样的类是可使用 await 异步等待的?
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [AutoSar NVM] 存储架构
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [gdc19]《战神4》中的全局光照技术
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [hdu4622 Reincarnation]后缀数组
  • [IE9] IE9 beta版下载链接