初始化socket

socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示:

unsigned int times = 0x0;
while((server = socket(PF_INET6, SOCK_STREAM, )) < && times < 0x3)
{
times++;
printf("create socket faild %d times\n", times);
}

设置socket的可重用属性

一般来说,一个端口释放后需要等待两分钟左右才能被再次使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。例如:一个进程监听一个端口,进程在某个时候异常重启了,如果socket没有设置可重用属性,那么进程重启后就会出现bind错误,因为同一个端口两次监听的时间间隔需要75秒;如果设置了可重用属性,那么同一个端口释放之后马上就可以再次使用,如下所示:

int reuse = 0x0;
result = setsockopt(server, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int));
if(result != )
{
printf(" Fail to set socket reuseraddr options, errno = 0x%x!\n", result);
}

设置socket的保活属性

TCP是一种面向连接的协议,因此需要实时检查连接是否正常,特别是在上层长时间无数据传输时。一般检查连接是否正常的方式是提供一个保活机制,即定时的发送一种探测报文,可以是上层自己发送,也可以使用socket自己提供的保活机制,也就是保活属性,但是socket自己提供的保活机制一般不可靠,或者说是不完全可靠,因此在实际编程中是两种同时使用。首先上层启用一个任务,定时发送检测报文,然后设置socket的保活属性,以期达到完全可靠,如下所示:

int optval = 0x1;
result = setsockopt(server, SOL_SOCKET, SO_KEEPALIVE, (char*)&optval, sizeof(int));
if(result != )
{
printf("Fail to set socket keepalive options, errno = 0x%x!\n", result);
}

设置socket的缓冲区大小属性

调用send和recv接口操作数据时,是直接将数据拷贝到缓冲区或是从缓冲器拷贝数据,如果缓存区满了,溢出后就会丢失数据,因此合理的设置缓存区的大小很重要,注意发送缓冲区和接收缓冲区是两个缓存区,不是同一个。如下所示:

int BufSize =  * ;
result = setsockopt(iSocketServer, SOL_SOCKET, SO_SNDBUF, (CHAR *)&BufSize, sizeof(BufSize));
if(result!= )
{
printf("Fail to set socket sendbuf options, errno = 0x%x!\n", result);
} int BufSize = * ;
result = setsockopt(iSocketServer, SOL_SOCKET, SO_RCVBUF, (CHAR *)&BufSize, sizeof(BufSize));
if(result != )
{
printf("Fail to set socket recvbuf options, errno = 0x%x!\n", result);
}

绑定socket

如果socket作为服务端,那么必须的操作是绑定一个IP,且绑定时并不是一定就会成功,因此使用多次绑定的方法,如下所示:

struct sockaddr_in6 ServerIp_V6 = {0x0};

memset(&ServerIp_V6, 0x0, sizeof(struct sockaddr_in6));
ServerIp_V6.sin6_family = AF_INET6;
ServerIp_V6.sin6_port = htons();
ServerIp_V6.sin6_addr = in6addr_any; times = ;
while((result = bind(server, (struct sockaddr *)&ServerIp_V6, sizeof(struct sockaddr_in6))) != && times < 0x3)
{
times++;
printf("Bind socket faild %d times\n", times);
}

监听socket

同绑定socket的操作,注意最大监听个数的选择,如下所示:

times = ;
listenMax = 0x10;
while ((lResultCode = listen(server, listenMax)) != && times < 0x3)
{
times++;
printf("[tkQxPotnDaemon] listen socket faild %d times\n", times);
}

等待客户端连接

服务端一切设置好之后,就需要调用accpet阻塞式等待客户端来连接,如下所示:

struct sockaddr_in6 ManagerIp_v6 = {0x0};
int AddrLen = sizeof(struct sockaddr_in6);
while()
{
memset(&ManagerIp_v6, 0x0, sizeof(struct sockaddr_in6));
AcceptSocket = accept(server, (struct sockaddr *)&ManagerIp_v6, (socklen_t *)&AddrLen);
if (AcceptSocket < )
{
continue;
} // 注意:ip是ManagerIp_v6.sin6_addr中的12、13、14、15位
// 如:ManagerIp_v6.sin6_addr[12]、ManagerIp_v6.sin6_addr[13]、ManagerIp_v6.sin6_addr[14]、ManagerIp_v6.sin6_addr[15] // 注意:端口号是htons(ManagerIp_v6.sin6_port) // 进行数据通信
}

服务端socket重用属性设置的更多相关文章

  1. tcp服务端socket

    import socket if __name__ == '__main__': # 创建tcp服务端socket tcp_server_socket = socket.socket(socket.A ...

  2. socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例

    socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...

  3. 在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程

    在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github ...

  4. Ali OSS服务端签名直传并设置上传回调

    服务端签名直传并设置上传回调 背景 请参考 Web端直传实践 里的背景介绍. 当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如 ...

  5. Java多线程技术:实现多用户服务端Socket通信

    目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...

  6. WCF服务端行为的一些设置

    [ServiceBehavior( InstanceContextMode = InstanceContextMode.Single,   //表示所有的请求都用一个服务实例来处理 Concurren ...

  7. ignite客户端找不到服务端的时候如何设置退出

    ignite启动客户端时需要有服务端支持: Ignition.setClientMode(true); Ignition.start("ignite.xml"); 这里有个问题,当 ...

  8. JQuery ajax request及Java服务端乱码问题及设置

    今天花了半天功夫才搞定2个乱码问题 1. 原先一直用form提交,现在改作JQuery ajax 提交,发现乱码. 2. window.location url中含有中文提交后,乱码. 第一个问题: ...

  9. c++ Socket客户端和服务端示例版本三(多线程版本)

    客户端 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/soc ...

随机推荐

  1. 团队进行Alpha冲刺--冲刺总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--冲刺总结 作业正文 如下 其他参 ...

  2. Swagger之外的选择

    今天给大家安利一款接口文档生成器--JApiDocs. swagger想必大家都用过吧,非常方便,功能也十分强大.如果要说swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注解 ...

  3. 二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引. B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的. 在 ...

  4. 尚硅谷maven视频教程笔记

    07.尚硅谷_Maven_部署Maven核心程序.avi 第一步先安装jdk 第二步下载maven 特别需要注意的是maven不能存储在有中文和空格的目录下面 3.调试是否安装成功,在cmd中输入 m ...

  5. set dict tuple 内置方法

    今日内容 * 元祖及内置方法* 字典及内置方法* 集合及内置方法* 字符编码 元祖tuple 与列表类似可以存多个值,但是不同的是元祖本身不能被修改 ```python一:基本使用:tuple 1 用 ...

  6. Java 数组最佳指南,快收藏让它吃灰

    两年前,我甚至写过一篇文章,吐槽数组在 Java 中挺鸡肋的,因为有 List 谁用数组啊,现在想想那时候的自己好幼稚,好可笑.因为我只看到了表面现象,实际上呢,List 的内部仍然是通过数组实现的, ...

  7. SpringBoot--集成actuator

    actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api 请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节 ...

  8. vue基础入门(2.2)

    2.2.基础指令 2.2.1.什么是指令 指令 (Directives) 是带有 v- 前缀的特殊特性,指令特性的值预期是单个 JavaScript 表达式,指令的职责是,当表达式的值改变时,将其产生 ...

  9. myeclipse集成jad反编译步骤

    (1) 将jad.exe放到java的jdk\bin目录下(2) 将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目\Common\plug ...

  10. 懂了!VMware/KVM/Docker原来是这么回事儿

    云计算时代,计算资源如同小马哥当年所言,已经成为了互联网上的水和电. 虚拟主机.web服务器.数据库.对象存储等等各种服务我们都可以通过各种各样的云平台来完成. 而在云计算欣欣向荣的背后,有一个重要的 ...