热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TCP网络编程的基本流程

TCP网络编程的基本流程对于服务端,通常为以下流程:调用socket函数创建socket调用bind函数将socket绑定到某个IP和端口上调用listen开始监听当有客户端请

TCP网络编程的基本流程

对于服务端,通常为以下流程:


  1. 调用socket函数创建socket
  2. 调用bind函数将socket绑定到某个IP和端口上
  3. 调用listen开始监听
  4. 当有客户端请求连接上来时,调用accept函数接受连接,产生一个新的socket
  5. 基于新产生的socket调用sendrecv函数,开始与客户端进行数据交流
  6. 通信结束后,调用close函数关闭套接字

对于客户端,通常为以下流程:


  1. 调用socket函数创建客户端socket

  2. 调用connect函数尝试连接服务器

  3. 连接成功后调用sendrecv函数,开始与服务器进行通信

  4. 通信结束后,调用close函数关闭socket

111

服务端代码实现如下:

#include
#include
#include
#include
#include
#include
#pragma clang diagnostic push
#pragma ide diagnostic ignored "EndlessLoop"
using std::cout;
using std::endl;
int main(int argc,char * argv[])
{//1.create socketint listenfd &#61; socket(AF_INET,SOCK_STREAM,0);if(listenfd &#61;&#61; -1){cout<<"create listenfd failed"<<endl;return -1;}//2.Initialize server addressstruct sockaddr_in bindaddr{};bindaddr.sin_family &#61;AF_INET;bindaddr.sin_addr.s_addr &#61; htonl(INADDR_ANY);bindaddr.sin_port&#61; htons(3000);if (bind(listenfd,(struct sockaddr*) &bindaddr, sizeof(bindaddr)) &#61;&#61; -1){cout<<"bind listen socket failed!"<<endl;return -1;}//3.Start listeningif(listen(listenfd,SOMAXCONN) &#61;&#61; -1){cout<<"listen error"<<endl;return -1;}while (true){sockaddr_in clientaddr{};socklen_t clientaddrlen &#61; sizeof(clientaddr);//4.accept client connectint clientfd &#61; accept(listenfd,(struct sockaddr*)&clientaddr,&clientaddrlen);if (clientfd !&#61; -1){//5.Receive data from the clientchar recvBuf[32]&#61;{0};int ret &#61; recv(clientfd,recvBuf,32,0);if (ret > 0){cout<<"Receive data from the client:"<<recvBuf<<endl;ret &#61; send(clientfd,recvBuf, strlen(recvBuf),0);if(ret !&#61; strlen(recvBuf))cout<<"send failed"<<endl;elsecout<<"send successfully"<<endl;}else{cout<<"Receive data error"<<endl;}close(clientfd);}}//7.close listenclose(listenfd);return 0;
}
#pragma clang diagnostic pop

客户端代码

#include
#include
#include
#include
#include
#include #define SERVER_ADDRESS "127.0.0.1"
#define SERVER_PORT 3000
#define SEND_DATA "helloworld"int main(int argc,char *argv[])
{//1.create socketint clientfd &#61; socket(AF_INET,SOCK_STREAM,0);if(clientfd &#61;&#61; -1){std::cout<<"create socket failed"<<std::endl;return -1;}//2.connect serversockaddr_in serveraddr;serveraddr.sin_family &#61; AF_INET;serveraddr.sin_addr.s_addr&#61; inet_addr(SERVER_ADDRESS);serveraddr.sin_port&#61; htons(SERVER_PORT);if (connect(clientfd,(struct sockaddr*) &serveraddr, sizeof(serveraddr)) &#61;&#61; -1){std::cout<<"connect socket error"<<std::endl;return -1;}//3. send data to serverint ret&#61; send(clientfd,SEND_DATA, strlen(SEND_DATA),0);if (ret !&#61; strlen(SEND_DATA)){std::cout<<"send data failed"<<std::endl;return -1;}std::cout<<"successfully"<<SEND_DATA<<std::endl;//4.recv data from serverchar recvBuf[32] &#61;{0};ret &#61; recv(clientfd,recvBuf,32,0);if(ret >0){std::cout<<"sucessfully"<<std::endl;} else{std::cout<<"failed"<<recvBuf<<std::endl;}//5.close socketclose(clientfd);return 0;
}


TCP网络编程的基本流程

Linux与C&#43;&#43;11多线程编程(学习笔记)

Linux select函数用法和原理

socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)

connect函数在阻塞和非阻塞模式下的行为

获取socket对应的接收缓冲区中的可读数据量


推荐阅读
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在CentOS 7.x上进行端口映射配置的方法,通过修改内核和配置防火墙实现端口映射。作者分享了自己使用华为服务器进行端口映射的经验,发现网速比直连还快且稳定。详细的配置过程包括开启系统路由模式功能、设置IP地址伪装、设置端口映射等。同时,还介绍了如何监听本地端口的tcp请求,以及删除规则和开放的端口的方法。 ... [详细]
author-avatar
手机用户2602926865
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有