一、TCP/IP协议四个抽象层:

二、socket位置

socket就在应用程序的传输层和应用层之间,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层。

三、socket三次握手:

第一次握手:客户端尝试连接服务器,向服务器发送syn包,

第二次握手:服务器接收客户端syn包并确认,同时向客户端发送一个SYN包,即SYN+ACK包

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,完成三次握手,建立连接

四、socket四次挥手:

第一次挥手:某个应用进程首先调用closesocket主动关闭连接,这时主动方(客户端或者服务端)发送一个FIN;

第二次挥手:被动方接收到FIN之后,执行被动关闭,对这个FIN进行确认,发送ACK确认信号。

第三次挥手:一段时间之后,被动关闭的一方在完成所有数据发送后,调用close()操作。这导致它也发送一个FIN;

第四次挥手:主动方接收到这个FIN,向被动方发送ACK进行确认,一段时间后进入关闭状态。被动方接收之后,进入关闭状态。

这样每个方向上都有一个FIN和ACK。

五、socket基本操作

1. socket函数

int socket(int domain, int type, int protocol);

socket()用于创建一个socket的套接字,它唯一标识一个socket。后续的操作都有用到这个套接字,把它作为参数,通过它来进行一些读写操作。

参数:

domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL等;

type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET等等;

protocol:指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等。当protocol为0时,会自动选择type类型对应的默认协议。

2. bind函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

参数:

sockfd:即socket套接字,它是通过socket()函数创建了,唯一标识一个socket;

addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址;

addrlen:对应的是地址的长度。

3. listen、connect函数

如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

服务器:int listen(int sockfd, int backlog);

参数:

sockfd:要监听的socket套接字;

backlog:相应socket可以排队的最大连接个数。

客户端:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:

sockfd:客户端的socket套接字;

addr:服务器的socket地址;

addrlen:socket地址的长度

4. accept函数

SOCKET accept(SOCKET sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:

sockfd:服务器的socket描述字;

addr:指向struct sockaddr *的指针,用于返回客户端的协议地址;

addrlen:协议地址的长度;

accept函数返回的是已连接的socket套接字。

5. send函数

int send( SOCKET s, const char FAR *buf, int len, int flags );

不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

参数:

s:指定发送端套接字描述符;

buf:指明一个存放应用程序要发送数据的缓冲区;

len:指明实际要发送的数据的字节数;

flags:一般置0。

不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

6. recv函数

int recv(SOCKET s,char *buf,int len,int flags);

参数:

s:接收端的套接字描述符;

buf:接收数据的缓冲区;

len:接收数据的字节数;

flags:一般置0。

7. closesocket函数

int closesocket(SOCKET s)

参数:

s:需要关闭的socket套接字。

六、代码实例:

在QT中使用之前需在.pro中添加socket库

LIBS += -lpthread libwsock32 libws2_32

服务端:

#include <QCoreApplication>
#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
using namespace std;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//初始化套接字库WORD word = MAKEWORD(2,2);//版本号WSADATA wsadata;WSAStartup(word,&wsadata);//定义服务端套接字,接受请求套接字SOCKET serviceSocket;SOCKET clientSocket;//服务端地址,客户端地址SOCKADDR_IN socketAddr;SOCKADDR_IN clientAddr;//填充服务端信息socketAddr.sin_family = AF_INET;socketAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");socketAddr.sin_port = htons(10000);//创建套接字serviceSocket = socket(AF_INET, SOCK_STREAM, 0);//绑定套接字int bRes = bind(serviceSocket, (SOCKADDR*)&socketAddr, sizeof(SOCKADDR)); //绑定注意的一点就是记得强制类型转换if (SOCKET_ERROR == bRes){cout << "Bind failure!" << endl;}else{cout << "Bind success!" << endl;}//设置套接字为监听状态int lLen = listen(serviceSocket, SOMAXCONN);if (SOCKET_ERROR == lLen){cout << "Listen failure!" << endl;WSACleanup();}else{cout << "Listen success!" << endl;}cout << "The server is listening for connection, please wait!" << endl;//接受连接请求int revSize = sizeof(SOCKADDR);clientSocket = accept(serviceSocket, (SOCKADDR*)&clientAddr, &revSize);if (clientSocket == SOCKET_ERROR){cout << "Accept connectionfailure!" << endl;WSACleanup();return 0;}cout << "Connection established, ready to receive data!" << endl;while (1){char recvBuf[1024];int recv_len = recv(clientSocket,recvBuf,100,0);if (recv_len < 0){cout << "Acceptfailure!" << endl;break;}else{cout << "Received client information:" << recvBuf << endl;}cout << "Please enter a reply message:";char sendBuf[1024];cin >> sendBuf;int send_len = send(clientSocket,sendBuf,strlen(sendBuf),0);if (send_len < 0){cout << "Send failure!" << endl;break;}}//关闭socketclosesocket(serviceSocket);//终止WSACleanup();return a.exec();
}

客户端:

#include <QCoreApplication>
#include <Windows.h>
#include <iostream>
using namespace std;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//初始化套接字库WORD word = MAKEWORD(2,2);//版本号WSADATA wsadata;WSAStartup(word,&wsadata);//定义客户端套接字SOCKET clientSocket;//服务端地址SOCKADDR_IN socketAddr;//填充服务端信息socketAddr.sin_family = AF_INET;socketAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");socketAddr.sin_port = htons(10000);//创建套接字clientSocket = socket(AF_INET, SOCK_STREAM, 0);//连接服务器int ret = connect(clientSocket, (SOCKADDR*)&socketAddr, sizeof(SOCKADDR));if(ret == SOCKET_ERROR){cout << "Connect failure!" << endl;WSACleanup();}else{cout << "Connect success!" << endl;}//发送数据while (1){char sendBuf[1024];cout << "Please enter send information:" << endl;cin >> sendBuf;int sendLen = send(clientSocket, sendBuf, 100, 0);if (sendLen < 0){cout << "Send success!" << endl;break;}char recvBuf[100];int recvLen = recv(clientSocket,recvBuf,100,0);if (recvLen < 0){cout << "Send failure!" << endl;break;}else{cout << "Received server information:" << recvBuf << endl;}}//关闭套接字closesocket(clientSocket);//释放DLL资源WSACleanup();return a.exec();
}

QT中使用C++ socket通信(了解socket通信、socket的三次握手和四次挥手、socket函数说明、客户端与服务端的代码实例)相关推荐

  1. 【java网络编程】TCP三次握手、四次挥手,常见Socket通信BIO

    网络编程,网络通信 内容管理 TCP三次握手,四次挥手 TCP 建立连接 --- 三次握手 TCP断开 ---- 四次挥手 java网络IO BIO 同步阻塞 Socket通信模型 BIO网络通信De ...

  2. TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理

    接着上一篇文章叙述: TCP/IP连接(在互联网的通信中,永远是客户端主动连接到服务端): 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协 ...

  3. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

  4. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  5. tcp 协议中发送窗口的大小应该是_TCP 协议中的三次握手与四次挥手

    今天来聊聊面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手.涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详解 4.什么是 TIME_ ...

  6. 清楚了解TCP三次握手和四次挥手的过程中各标志的含义

    本次内容:首先要了解什么是三次握手四次挥手,以及为什么是三次握手和四次挥手,并且观察TCP协议中各标志,并说明. 构建合适的拓扑结构:搭建出客户端(client)-服务器(server) 配置好基本的 ...

  7. Node 学习八、通信之 01 网络通信基本原理、网络层次模型、数据封装与解封装、TCP三次握手与四次挥手

    网络通信基本原理 网络通信(或通讯)模型和通讯协议(常见的 HTTP.TCP/IP.FTP等)解决的本质问题就是主机与主机之间的网络通信. 下面以最基本的两台主机之间的通信开始,慢慢认识网络通信模型和 ...

  8. Linux网络编程--TCP中的三次握手和四次挥手

    服务器编程和客户端编程的大致流程如下: 三次握手是在客户端中的connect中完成的,具体如下: 那么上述说到的SYN     ACK这些是什么东西呢? 上述的截图取自<Linux高性能服务器编 ...

  9. socket bufferedinputstream通信读取不到服务器返回的响应_TCP角度看socket通信过程,socket怎么表示三次握手,四次挥手...

    什么是套接字? socket 的中文翻译过来就是"套接字".套接字是什么,它的英文含义:插座. Socket 就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通 ...

最新文章

  1. C语言必须会写的10道经典题(小白必看!)
  2. java JDK 11.0.5的安装
  3. php获取mysql数据菜鸟_PHP 连接 MySQL | 菜鸟教程
  4. maven入门(1-3)maven的生命周期
  5. 皮一皮:到底是土还是士...
  6. 通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
  7. 【Ubuntu】安装Java和Eclipse
  8. 《基于张量网络的学习入门》学习笔记3
  9. cordova-plugin-app-version插件使用
  10. Spring Boot集成Redis缓存之RedisTemplate的方式
  11. C# 实现在线软件自动升级自动下载更新文件
  12. ajax 前端报错,Django ajax 发送post请求 前端报错解决
  13. python线程join方法_Python多线程join()用法
  14. edius多机位多轨编辑
  15. Linux运维工程师必看:如何成为一个合格的运维工程师
  16. 二级计算机合格,计算机二级考试合格的分数线
  17. Linux下如何查看硬盘型号、序列号、缓存 CPU 主板 等信息
  18. fullcalendar 课程表 js 插件 日程安排操作 js
  19. Openstack Cinder Ceph(RBD)备份恢复过程(backup/restore)
  20. EasyWechat微信支付jsapi缺少参数 total_fee

热门文章

  1. Apple Pay的实现
  2. MySQL存入的时间和取出时间不一致的解决
  3. 机器学习模型-外卖订单量预测异常报警模型实践
  4. 网店运营计划,淘宝店铺如何提高买家回头率!
  5. OV荣耀小米千元机大对决 谁才是千元自拍王?
  6. 深入理解 SQL 中的 Grouping Sets 语句
  7. ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点
  8. acpi event
  9. 磁盘名称:裸设备名称、lvm卷、盘符的理解
  10. 输入一个不大于10的9次方的正整数,从高位开始逐位分割并输出各位数字。 例如,输入 12345 ,输出 1 2 3 4 5