服务器端:

服务器端先创建一个socket,然后把这个socket绑定到端口上,接着让它向tcp/ip协议栈请求一个监听服务并创建一个accept队列来接受客户端请求。

void creat_tcpServer()
{
int32 listenfd; /* Create socket for incoming connections */
do{
//AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型
//SOCK_STREAM 指TCP通信
     //0:系统根据地址格式和套接字类型,自动选择一个合适的协议,因为这里是TCP,也可填IPPROTO_TCP
        listenfd = socket(AF_INET, SOCK_STREAM, );
if(listenfd == -)
{
vTaskDelay(/portTICK_RATE_MS);
}
}while(listenfd == -); struct sockaddr_in server_addr;
int32 ret;
/* Construct local address structure */
memset(&server_addr, , sizeof(server_addr));/* Zero out structure */
server_addr.sin_family = AF_INET; /* Internet address family */
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_len = sizeof(server_addr);
server_addr.sin_port = htons(); /* Local port */
//绑定socket:将创建的socket绑定到本地的IP地址和端口,此socket是半相关的,只是负责
//侦听客户端的连接请求,并不能用于和客户端通信
do{
ret = bind(listenfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret != )
{
vTaskDelay(/portTICK_RATE_MS);
}
}while(ret != ); //listen侦听: 第一个参数是套接字,第二个参数为accept队列大小,当服务器接收到第三次握手后
//将连接放到这个队列中,直到被accept处理才清除。当accept队列满了之后,即使client继续向server发
//送ACK的包,也会不被响应,此时ListenOverflows+1,同时server通\
//过/proc/sys/net/ipv4/tcp_abort_on_overflow(linux kernel 2.2之后)来\
//决定如何返回,0表示直接丢弃该ACK,1表示发送RST通知client;相\
//应的,client则会分别返回read timeout 或者 connection reset by peer。
do{
/* Listen to the local connection */
ret = listen(listenfd, );
if(ret != )
{
vTaskDelay(/portTICK_RATE_MS);
}
}while(ret != ); int32 client_socket;
int32 len = sizeof(struct sockaddr_in);
int32 recbytes;
struct sockaddr_in remote_addr; for(;;)
{
/*block here waiting remote connect request*/
if((client_socket = accept(listenfd, (struct sockaddr *)&remote_addr, (socklen_t *)&len)) < )
{
continue;
} char *recv_buf = (char *)zalloc(); while ((recbytes = read(client_socket , recv_buf, )) > )
{
//数据保存在recv_buf
}
free(recv_buf); if(recbytes <= )
{
close(client_socket);
}
}
}

客户端:

    for(;;)
{ sta_socket = socket(PF_INET, SOCK_STREAM, );
if (- == sta_socket)
{
close(sta_socket);
vTaskDelay(/portTICK_RATE_MS);
printf("ESP8266 TCP client task > socket fail!\n");
continue;
}
printf("ESP8266 TCP client task > socket ok!\n");

     //开启keepalive
     keepalive = 1;
if(setsockopt(sta_socket, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive)) < )
{
printf("set keepalive fail");
} bzero(&remote_ip, sizeof(struct sockaddr_in));
remote_ip.sin_family = AF_INET;
remote_ip.sin_addr.s_addr = inet_addr(server_ip);
remote_ip.sin_port = htons(server_port);
if( != (connect_status = connect(sta_socket, (struct sockaddr *)(&remote_ip), sizeof(struct sockaddr))))
{
close(sta_socket);
vTaskDelay(/portTICK_RATE_MS);
printf("ESP8266 TCP client task > connect fail!\n");
continue;
}
printf("ESP8266 TCP client task > connect ok!\n");

     //如该连接在60秒没有任何数据往来,则进行探测
keepidle = 60
setsockopt(sta_socket, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
     //探测时发包的时间间隔为5秒
     keepinterval = 5;
setsockopt(sta_socket, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
     //探测尝试的次数,如果第1次探测包就收到响应,则后2次的不再发
keepcount = 3;
setsockopt(sta_socket, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));    
setsockopt(sta_socket, IPPROTO_TCP, TCP_NODELAY, (void *)&flag , sizeof(flag));
while ((recbytes = read(sta_socket , recv_buf, )) > )
{
handle_server_data(recv_buf, recbytes);
}
if(recbytes <= )
{
close(sta_socket);
printf("ESP8266 TCP client task > server closed!\n");
} }

socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)的更多相关文章

  1. Linux系统编程(32)—— socket编程之TCP服务器与客户端

    TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...

  2. python网络编程socket编程(TCP、UDP客户端服务器)

    摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...

  3. socket编程实现tcp服务器_C/C++

    1. 需求分析 实现一个回声服务器的C/S(客户端client/服务器server)程序,功能为客户端连接到服务器后,发送一串字符串,服务器接受信息后,返回对应字符串的大写形式给客户端显示. 例如: ...

  4. Node学习笔记:建立TCP服务器和客户端之间的通信

    结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...

  5. Linux系统编程(34)—— socket编程之TCP服务器与客户端的交互

    前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器收回来,现在我们把它改成交互式的,不断从终端接受用户输入并和server交互. /* client.c */ #in ...

  6. [javaSE] 网络编程(TCP服务端客户端互访阻塞)

    客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...

  7. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  8. 10-51单片机ESP8266学习-AT指令(ESP8266连接路由器,建立TCP服务器,分别和C#TCP客户端和AndroidTCP客户端通信+花生壳远程通信)

    http://www.cnblogs.com/yangfengwu/p/8871464.html 先把源码和资料链接放到这里 源码链接:https://pan.baidu.com/s/1wT8KAOI ...

  9. Python 绝技 —— TCP服务器与客户端

    i春秋作家:wasrehpic 0×00 前言 「网络」一直以来都是黑客最热衷的竞技场.数据在网络中肆意传播:主机扫描.代码注入.网络嗅探.数据篡改重放.拒绝服务攻击……黑客的功底越深厚,能做的就越多 ...

随机推荐

  1. Java基础——内部类

    一.什么是内部类 将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类 内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$In ...

  2. HBase 高级架构解析

    整体框架 使用 ZooKeeper 框架协助 RegionServer(类似于HDFS的nodemanager)用户请求从 Client 到 Zookeeper 进行判断数据属于哪一个 Region ...

  3. RHEL-7.1 Server.x86_64 yum源设置为光盘

    1.挂载光盘 首先在media目录下创建文件夹CentOS mkdir CentOS 然后将光盘挂载在CentOS下 mount -t iso9660 -o loop /dev/cdrom /medi ...

  4. MVC中Session的使用和传递

    1.登录时在controller中记录session,代码如下: public ActionResult Login(UserLoginViewModel uViewModel) { if (Mode ...

  5. struts2官方 中文教程 系列九:Debugging Struts

    介绍 在Struts 2 web应用程序的开发过程中,您可能希望查看由Struts 2框架管理的信息.本教程将介绍两种工具,您可以使用它们来查看.一个工具是Struts 2的配置插件,另一个是调试拦截 ...

  6. express与ejs,ejs在Linux上面的路径问题

    1.学习使用ejs模板(这个是ejs.js) var express = require('express'); var app = express(); app.set("view eng ...

  7. 剑指offer-跳台阶08

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). class Solution: def jumpFloor(self, ...

  8. pep8介绍

    pep8介绍: PEP8是针对python代码格式而编订的风格指南,采用一致的编码风格可以令代码更加易懂易读! (1)空白: python中空白会影响代码的含义及其代码的清晰程度 使用space(空格 ...

  9. Ubuntu 进阶命令——长期不定时更新

    有时候远程连接服务器忽然中断或者不小心关掉了终端界面,正在运行的命令或者程序就会被强制停止.这时候,我们可以借助一些命令来避免这种情况的发生. nohup 不挂断地运行命令 & 在后台运行命令 ...

  10. pexpect获取远端命令执行结果

    类比于shell的expect, python中使用pexpect模块来模拟用户和终端交互.有的时候使用pexpect.sendline发送命令后,在各种条件影响下, 可能并不能保证命令在远端服务器执 ...