Socket通信基本流程
- 格式:docx
- 大小:12.37 KB
- 文档页数:1
三菱Q系列PLC之间SOCKET通讯详解
一、SOCKET基本概念
(1)是什么?
SOCKET:SOCKET是对TCP/IP协议的封装,SOCKET 本身并不是协议,而是一个
调用接口(API)。
通过SOCKET,我们才能使用TCP/IP协议。
(2)应用层协议有HTTP、FTP等。
传输数据时,可以只使用TCP/IP协议(传输层),
但是那样的话,如果没有应用层,便无法识别数据内容。
如果要使传输的数据
有意义,则必须使用到应用层协议。
(3)有什么用?
SOCKET的出现只是使程序员更方便的使用TCP/IP协议栈而已。
就像操作系统会
提供标准的编程接口,TCP/IP也要提供可供程序员做网络开发所用的接口,这
就是Socket编程接口。
二、硬件配置
(1)Q03UDECPU2套
(2)路由器(可选)
三、软件配置
(1)GX-WORKS2
(2)以太网调试工具(可选)四、实验步骤
(1)1#PLC配置(PLCA)STEP1:
STEP2:
(2)2#PLC配置(PLCB)STEP1:。
c语言select socket编程用法C语言是一种广泛使用的程序设计语言,其具有良好的可移植性、灵活性和高效性,所以在网络编程中也被广泛使用。
其中,select函数是常用的网络编程技术,本文将介绍C语言中如何使用select函数进行socket编程。
一、socket编程简介网络编程中,socket是一种通信机制,因此通常采用socket编程来实现网络协议。
socket编程的基本流程是:创建socket->绑定IP 和端口号->监听->接收连接->发送和接收数据->关闭连接->关闭socket。
在socket编程中,需要用到的库文件有sys/socket.h、netinet/in.h、arpa/inet.h等。
二、select函数介绍select函数是一种多路复用技术,通过它可以同时监视多个文件描述符的状态,当其中一个或多个文件描述符发生变化时,select函数就可以返回。
select函数的原型为:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout),参数说明如下:nfds:待检测的最大文件描述符加1。
readfds:可读文件描述符集合。
writefds:可写文件描述符集合。
exceptfds:异常文件描述符集合。
timeout:select函数在阻塞的时候,等待时间的长度。
select函数会在一定时间内阻塞等待,直到有文件描述符准备好或达到超时时间。
如果出现异常,select函数的返回值为-1,否则返回已准备好的文件描述符数量。
三、select函数的使用在使用select函数进行socket编程时,只需要将需要监控的socket加入到可读文件描述符集合中即可。
如下所示:1. 创建socket并绑定IP和端口号;2. listen函数将该socket设置为监听状态;3. 将该监听socket加入到可读文件描述符集合中;4. 使用select函数进行监控,并等待传入的连接请求;5. 当select函数返回,并且其中包含监听socket的可读集合,则调用accept函数接收连接请求。
Socket.io是一个基于事件的实时Web套接字框架,它使得服务器和客户端之间的实时双向通信变得更加简单和高效。
在本篇文章中,我们将介绍Socket.io的基本操作,包括如何安装、创建服务器和客户端,以及如何进行实时通信等内容。
通过本文的学习,读者将可以快速掌握Socket.io的基本用法,并应用到实际的开发项目中。
一、安装Socket.io我们需要安装Node.js,因为Socket.io是一个基于Node.js的库。
在安装了Node.js之后,我们可以使用npm命令来安装Socket.io。
1. 打开命令行工具,输入以下命令来安装Socket.io:```shellnpm install socket.io```2. 等待安装完成之后,我们就可以在项目中引入Socket.io并开始使用了。
二、创建服务器在使用Socket.io之前,我们首先需要创建一个服务器来处理客户端的连接和通信。
下面是一个简单的示例代码来创建一个Socket.io服务器。
1. 在项目中引入Socket.io:```javascriptconst 网络协议 = require('网络协议');const express = require('express');const socketIO = require('socket.io');const app = express();const server = 网络协议.Server(app);const io = socketIO(server);```2. 接下来,我们需要监听客户端的连接事件,并处理客户端的消息。
以下是一个简单的示例代码:```javascriptio.on('connection', (socket) => {console.log('a user connected');socket.on('message', (msg) => {console.log('message: ' + msg);});socket.on('disconnect', () => {console.log('user disconnected');});```三、创建客户端在服务器创建完成之后,我们可以开始创建客户端来连接到服务器并进行通信。
利用Delphi编写Socket通信程序一、前言随着计算机技术的不断发展,网络应用得到了越来越广泛的应用,而Socket编程作为网络编程中最基础、最重要的部分,具有非常重要的意义。
Delphi是一种构建Windows应用程序的高级集成开发工具,支持对象化设计、事件驱动、可视化编程等多种编程方式。
Delphi具有非常强大的GUI设计、数据访问、组件开发等特点,可以方便地应用到Socket编程中,实现Socket通信程序的开发。
本文就介绍利用Delphi编写Socket通信程序相关的知识。
二、Socket编程基础Socket是一种用于网络通信的编程接口,它把网络通信抽象成发送和接收数据的过程。
Socket编程分为客户端和服务器两部分,客户端负责向服务器发起连接请求,服务器则负责接收客户端的连接请求,并根据请求提供相应的服务。
Socket编程中,通常使用TCP/IP协议进行数据传输。
TCP协议是一种可靠的、面向连接的协议,它通过三次握手建立连接,保证数据的可靠性、完整性和顺序性。
而UDP协议则是一种不可靠的、无连接的协议,它不保证数据的可靠性和完整性,但具有数据传递速度快等特点。
通常,TCP协议适用于对数据可靠性要求较高的应用场景,如文件传输、邮件系统、即时通信等;而UDP协议适用于对数据传输速度要求较高的应用场景,如视频直播、网络游戏等。
三、利用Delphi编写Socket通信程序1. 创建Socket使用Delphi进行Socket编程,可通过TServerSocket和TClientSocket组件来实现。
TServerSocket组件用于创建服务器Socket,TClientSocket组件用于创建客户端Socket。
在Delphi中,可以通过在组件面板中拖拽TServerSocket或TClientSocket组件来创建Socket。
使用TServerSocket组件创建服务器Socket的示例代码如下:```delphiprocedure TMyForm.FormCreate(Sender: TObject);begin ServerSocket1.Port := 8888;ServerSocket1.Active := True;end;procedure TMyForm.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);beginMemo1.Lines.Add(Socket.RemoteAddress + ' connected.');end;```上述代码中,将ServerSocket1的Port属性设置为8888,表示该服务器监听8888端口的连接请求。
swift socket的使用在Swift中,你可以使用Foundation库中的Socket API来创建和管理socket连接。
以下是一些使用Swift Socket的基本步骤:1. 导入Foundation框架:```swiftimport Foundation```2. 创建socket对象:```swiftlet socket = Socket()```你可以使用`Socket()`初始化一个空的socket对象,然后通过socket对象的方法进行进一步的配置和操作。
3. 设置socket的地址信息:```swiftlet address = "127.0.0.1" // 服务器的IP地址let port = 8080 // 服务器监听的端口号socket.address = addresssocket.port = port```4. 连接到服务器:```swiftsocket.connect()```这将异步地连接到指定的服务器。
5. 发送和接收数据:```swiftlet message = "Hello, Server!"socket.send(message)let response = socket.read()```使用`send(_:)`方法向服务器发送数据,使用`read()`方法读取服务器的响应。
6. 关闭socket连接:```swiftsocket.disconnect()```当你完成所有的操作后,通过调用`disconnect()`方法来关闭连接。
以上是使用Swift Socket的基本步骤,你可以根据你的需求进一步使用socket API中的其他方法来处理异常情况、设置超时、处理并发连接等等。
socket通信的原理一、什么是Socket通信?Socket通信是指在网络上两个计算机之间进行双向的数据传输。
它是一种可靠的、可靠的、可伸缩的、可伸缩的、可伸缩的IP网络通信台式机的标准。
二、Socket通信的原理Socket通信有两个连接对象:客户端和服务器端。
客户端通过它的Socket向服务器端发送消息,服务器端则使用它的Socket来监听客户端的消息,当收到消息时,服务器端就会进行响应。
客户端和服务器端之间的Socket通信分为两个阶段:首先是Socket链接的建立,其次是Socket数据传输。
1、链接建立客户端会先启动一个链接,发出一个接收连接的请求到服务器端,请求的信息被称之为Syn(Synchronize)报文。
服务器端收到Syn报文后,会向客户端发出确认报文,称为Syn-Ack(Synchronize-Acknowledgment)报文,之后客户端会发出Ack (Acknowledgment)报文,完成三次握手,此时Socket链接已建立完成。
2、数据传输当客户端链接建立完成后,就可以通过Socket进行双向的数据传输。
数据传输的过程就像两个人在使用电话一样,只需要将自己的消息发送给对方,对方就可以接收到消息。
三、Socket通信的优势Socket通信和其它网络通信有很多优势:1、高效:Socket通信的数据通讯效率高,接近本地通讯;2、可靠:Socket通信是可靠的网络通讯方式,比如它可以在网络中传播压缩或加密的消息;3、安全:Socket通信是经过加密的,可以保证消息不会被篡改或拦截;4、易用:Socket通信可以支持跨平台,不同的操作系统间都可以进行连接;5、可扩展性:Socket通信可以轻松扩展应用,不会影响之前的连接和功能。
qt下tcp和udp的通信流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!Qt框架下的TCP与UDP网络通信实现在软件开发中,网络通信是不可或缺的一部分,而Qt作为一款强大的C++应用程序开发框架,提供了完善的网络编程接口,使得开发者能够方便地处理TCP和UDP协议的通信。
python socket 发送数据方法
在Python中,使用Socket发送数据的基本步骤如下:
首先,需要创建一个Socket对象,然后绑定到一个地址(在这个例子中,我们使用的是本地主机和端口8000)。
然后,我们可以使用`connect()`方法连接到远程主机。
一旦连接建立,我们可以使用`send()`方法发送数据。
以下是一个简单的例子:
```python
import socket
创建一个socket对象
s = (_INET, _STREAM)
绑定到本地主机和端口8000
(('localhost', 8000))
连接到远程主机
(('remote_host',
发送数据
(b'Hello, World!')
```
请注意,上述代码只是一个基本示例。
在实际使用中,您可能需要处理各种错误情况,例如网络错误或数据发送/接收错误。
此外,您可能还需要在完成数据传输后关闭Socket连接。
此外,还要注意的是`send()`方法接受的参数必须是一个字节串(bytes)。
如果你要发送字符串,你需要先调用`.encode()`方法将其转换为字节串。
在上述代码中,我们发送的字符串'Hello, World!'被自动转换为字节串。
socket5 应答流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 客户端连接到服务器:客户端打开一个 TCP 连接到服务器的指定端口(通常是 1080)。
qt下tcp和udp的通信流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!Qt框架下的TCP与UDP网络通信实现在软件开发中,网络通信是不可或缺的一部分,尤其是在构建分布式系统和实时交互应用时。
简单的客户/服务器程序设计与实现实验目的及要求:1、熟悉C编程环境。
2、熟悉Socket编程原理,掌握简单的套接字编程。
实验设备:硬件:PC机软件:CodeBlocks实验内容及步骤:什么是Socket?Socket 英文直译为“孔或插座”,也称为套接字。
用于描述IP 地址和端口号,是一种进程间的通信机制。
你可以理解为IP 地址确定了网内的唯一计算机,而端口号则指定了将消息发送给哪一个应用程序(大多应用程序启动时会主动绑定一个端口,如果不主动绑定,操作系统自动为其分配一个端口)。
Socket 的类型Stream:一种流式Socket,针对于面向连接的TCP 服务应用,安全,但效率低。
(本文重点)Datagram:数据报式的Socket,针对于无连接的UDP 服务应用,不安全(丢失、顺序混乱,往往在接收端要分析完整性、重排、或要求重发),但效率高。
Socket 程序一般应用模式及运行流程服务器端会启动一个Socket,开始监听端口,监听客户端的连接信息,我们称之为Watch Socket。
客户端Socket 连接服务器端的监听Socket,一旦成功连接,服务器端会立刻创建一个新的Socket 负责与客户端进行通信,之后,客户端将不再与Watch Socket 通信。
Watch Socket 继续监听可能会来自其他客户端的连接。
上述过程就像是实现了一次三方会谈。
服务器端的Socket 至少会有 2 个。
一个是Watch Socket,每成功接收到一个客户端的连接,便在服务器端创建一个通信Socket。
客户端Socket 指定要连接的服务器端地址和端口,创建一个Socket 对象来初始化一个到服务器的TCP 连接。
编写用TCP协议实现的Client端和Server端程序并调试通过。
程序分两部分:客户程序和服务器程序。
工作过程是:服务器首先启动,它创建套接字之后等待客户的连接;客户启动后创建套接字,然后和服务器建立连接;建立连接后,客户接收键盘输入,然后将数据发送到服务器,服务器收到到数据后,将接收到的字符在屏幕上显示出来。
lwIP是一个轻量级的开源TCP/IP协议栈,可以在嵌入式设备上运行。
在lwIP中,使用TCP socket进行网络通信是非常常见的,本文将介绍lwIP中的TCP socket编程。
一、包含头文件在使用lwIP的TCP socket进行编程时,首先要包含lwIP的头文件。
需要包含的头文件主要有lwip/tcp.h和lwip/err.h。
```c#include "lwip/tcp.h"#include "lwip/err.h"```二、创建TCP连接使用lwIP的TCP socket进行编程时,首先需要创建一个TCP连接。
可以通过调用tcp_new函数来创建一个新的TCP连接。
```cstruct tcp_pcb *pcb;pcb = tcp_new();if (pcb != NULL) {// 创建成功,可以继续进行后续操作} else {// 创建失败,进行错误处理}```三、绑定本地IP位置区域和端口创建TCP连接后,需要将其绑定到本地的IP位置区域和端口上。
可以通过调用tcp_bind函数来实现。
```cerr_t err;err = tcp_bind(pcb, IP_ADDR_ANY, 1234);if (err == ERR_OK) {// 绑定成功,可以继续进行后续操作} else {// 绑定失败,进行错误处理}```四、监听连接请求绑定本地IP位置区域和端口后,可以调用tcp_listen函数来监听连接请求。
```ctcp_arg(pcb, arg);tcp_accept(pcb, accept_callback);tcp_listen(pcb);```五、接受连接当有客户端发起连接请求时,可以通过accept_callback函数来接受连接。
```cerr_t accept_callback(void *arg, struct tcp_pcb *newpcb, err_t err) {if (err == ERR_OK) {// 接受连接成功,可以进行后续操作} else {// 接受连接失败,进行错误处理}return ERR_OK;}```六、发送数据接受连接后,可以使用tcp_write函数来发送数据。
Socket俗称套接字,用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过套接字向网络发出请求或者应答网络请求。
他是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
它是网络通信过程中端点的抽象表示,包含进行网络通信必需的5中信息:连接使用的协议、本地主机的IP地址,本地进程的协议端口、远程主机的IP地址和远地进程的协议端口。
Socket有两种主要的操作方式:面向连接的和无连接的。
面向连接:必须建立一个连接和一个呼叫,所有事情的到达顺序和出发顺序一致。
使用TCP协议,此时Socket必须在发送数据之前与目的地的Socket取得连接。
效率不高,但是安全。
无连接:事情到达顺序和出发顺序不保证一致。
使用数据报协议,一个数据报是一个独立的单元,它包含了这次投递的所有信息。
快速,高效,但安全性不高。
若数据的可靠性更重要的话推荐使用面向连接的操作。
Socket构造中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
部分构造方法如下:Socket(InetAddress address,int port ,InetAddress localAddr ,int localPort)Socket(InetAddress address, int port ,boolean stream)Socket(SocketImpl impl)ServerSocket(int port , int backlog, InetAddress bindAddr)address、host、port分别表示双向连接中另一方的IP地址、主机名、端口号stream指明Socket是流Socket还是数据报SocketlocalAddr,bindAddr是本地机器的地址(ServerSocket的主机地址)impl是Socket的父类,既可以创建ServerSocket,也可创建Socket在选择端口时必须小心。
mqtt 底层原理的实现调用socket -回复MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,用于在物联网(IoT)场景中的设备和应用程序之间进行通信。
它具有低能耗、开销小以及可靠性高的特点,成为了物联网领域中最常用的通信协议之一。
在MQTT底层中,主要通过调用socket实现其通信功能。
本文将详细解析MQTT底层原理的实现,以及如何调用socket进行通信。
1. MQTT协议简介MQTT协议是一种基于发布/订阅模式的协议,通过客户端和服务端之间的消息交互来实现通信。
MQTT主要由以下几个概念组成:- 客户端(Client):发布和订阅消息的应用程序或设备。
- 代理服务器(Broker):接收和分发消息的服务器,负责转发消息。
- 主题(Topic):消息的目的地,用于标识消息的类别或内容。
- 消息(Message):传输的数据单元。
2. MQTT通信流程MQTT通信流程主要包含以下几个步骤:- 连接建立:客户端通过TCP连接到MQTT代理服务器。
- 订阅:客户端向代理服务器发送订阅请求,指定感兴趣的主题。
- 发布:客户端向代理服务器发送消息,并指定发布的主题。
- 代理服务器消息转发:代理服务器将订阅到的消息转发给对应的订阅者。
- 断开连接:客户端和代理服务器断开连接。
3. MQTT底层原理实现MQTT底层实现主要依赖于对socket的调用。
Socket是一个抽象层,用于将网络通信进行抽象,提供了一套简洁的接口,用于在不同的网络中进行通信。
在MQTT底层实现中,首先创建一个socket对象,然后使用该对象进行连接建立、发送和接收消息。
具体步骤如下:- 创建socket对象:使用socket函数创建一个套接字对象,指定网络类型(TCP或UDP)和协议类型。
- 连接建立:使用socket的connect函数将套接字对象连接到指定的服务器地址和端口。
lwip是一个轻量级的网络通信协议栈,它被广泛应用于嵌入式系统中进行网络通信。
在lwip协议栈中,socket编程是一种常见的网络通信方式,通过socket编程可以实现基于TCP/IP协议的数据传输。
一、lwip协议栈简介lwip是一个轻量级的网络通信协议栈,它采用了轻量级的设计思路,适用于资源有限的嵌入式系统。
lwip协议栈具有良好的可移植性和高效的性能,因此被广泛应用于嵌入式系统中进行网络通信。
二、socket编程概述socket是一种通用的网络编程接口,通过socket编程可以实现不同主机之间的网络通信。
在lwip协议栈中,socket编程可以通过lwip提供的API进行实现,包括socket创建、数据传输、连接管理等功能。
三、lwip socket编程的基本流程1. 创建socket在进行lwip socket编程时,首先需要创建一个socket。
通过调用lwip提供的API函数,可以创建一个socket,并指定socket的类型(如TCP或UDP)。
2. 绑定socket创建socket后,需要将socket与特定的IP位置区域和端口号绑定。
这样,其他主机就可以通过指定的IP位置区域和端口号与该socket进行通信。
3. 监听和连接对于TCP类型的socket,需要调用相应的API函数启动监听,并等待客户端的连接请求。
一旦有客户端连接请求到达,就可以建立连接。
4. 数据传输一旦建立了连接,就可以进行数据传输。
通过socket的读写API函数,可以实现数据的发送和接收。
5. 关闭连接在通信结束后,需要关闭已经建立的连接,并释放相应的资源。
四、lwip socket编程常见问题及解决方法1. 超时处理在进行lwip socket编程时,常常会遇到网络超时的情况。
为了避免这种情况,可以通过设置合适的超时时间,并进行超时处理。
2. 数据丢失在数据传输过程中,有可能会出现数据丢失的情况。
为了保证数据传输的可靠性,可以使用一些数据校验和重传机制。
socket监听原理Socket监听原理Socket是一种网络通信协议,它将数据从一个程序传递到另一个程序。
在网络通信中,Socket扮演着非常重要的角色。
在本文中,我们将讨论Socket监听的原理。
一、什么是Socket监听Socket监听是指在服务器端创建一个套接字,并通过该套接字接收来自客户端的连接请求。
当客户端请求连接时,服务器端将创建一个新的套接字与该客户端进行通信。
二、Socket监听的基本流程1. 创建套接字在服务器端创建一个套接字,以便接收来自客户端的连接请求。
可以使用以下代码创建套接字:```int server_socket = socket(AF_INET, SOCK_STREAM, 0);```其中,AF_INET表示使用IPv4协议,SOCK_STREAM表示使用TCP 协议。
2. 绑定IP地址和端口号为了使其他计算机能够与服务器进行通信,需要将服务器的IP地址和端口号绑定到套接字上。
可以使用以下代码绑定IP地址和端口号:```struct sockaddr_in server_address;server_address.sin_family = AF_INET;server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址server_address.sin_port = htons(8080); // 服务器端口号bind(server_socket, (struct sockaddr*)&server_address,sizeof(server_address));```其中,inet_addr函数将IP地址转换为网络字节序(大端序),htons 函数将端口号转换为网络字节序。
3. 监听连接请求使用以下代码将套接字设置为监听状态:```listen(server_socket, 5);```其中,第二个参数表示等待连接队列的最大长度,通常设置为5。
计算机⽹络C语⾔Socket编程,实现两个程序间的通信C语⾔S o c k e t编程,实现两个程序间的通信se r v e r和cli e n t通信流程图在mooc上找到的,使⽤Socket客户端client和服务端server通信的流程图不⼀定只⽤codeblock,⽤devcpp编译器也可以的,需要很简单的配置⼀下编译环境实现两个程序间的通信1.服务端se r v e r服务端需要 "两个"套接字 :1.服务端套接字serverSocket2.客户端connect连接请求时,发来的套接字clientSocket按流程图来看, server服务端主要就是实现下⾯⼏个步骤:0.WSAStartup初始化 //这个东西也不知道是什么⿁,反正就是要初始化⼀下,不初始化会创建socket失败!1.服务端套接字 = socket(); //获取⼀个套接字对象吧?2.bind(服务端套接字); //绑定3.listen(服务端套接字); //监听---这个时候客户端就可以发连接请求到服务端了,此时服务端会⽤accept阻塞进程,直到获取客户端发来的请求---4.客户端套接字 = accept(); //收到客户端发来的请求,accept返回客户端的套接字对象5.recv(客户端套接字,要发的消息message) //recv会阻塞进程,直到客户端发送消息过来----printf(message)把接收到的消息打印出来-----6.send(客户端套接字,要发的消息message) //服务端也可以使⽤send,向客户端发送消息---这⾥可以循环,跳转回到步骤3.accept 开启新⼀轮的接收请求---7.closesocket(客户端套接字);所以服务端代码可以这样写在windows下需要更改很多头⽂件,和⼀些函数,wsastartup这个东西也需要初始化⼀下。
改了之后,⼀个可以⽤的服务端server代码#include <sys/stat.h>#include <fcntl.h>#include <winsock2.h>#include <windows.h>#pragma comment(lib, "wsock32.lib")#include <errno.h>#include<stdlib.h>#include<string.h>#include <sys/types.h>#include<ws2tcpip.h>#include <stdio.h>#include <unistd.h>#define SERVER_PORT 6666/*监听后,⼀直处于accept阻塞状态,直到有客户端连接,当客户端如数quit后,断开与客户端的连接*/int main(){//调⽤socket函数返回的⽂件描述符int serverSocket;//声明两个套接字sockaddr_in结构体变量,分别表⽰客户端和服务器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[200]; //存储发送和接收的信息int iDataNum;//必须先初始化WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) !=2){ printf("require version fail!");return -1;}//socket函数,失败返回-1//int socket(int domain, int type, int protocol);//第⼀个参数表⽰使⽤的地址类型,⼀般都是ipv4,AF_INET//第⼆个参数表⽰套接字类型:tcp:⾯向连接的稳定数据传输SOCK_STREAM//第三个参数设置为0//建⽴socketif((serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) {perror("socket");return 1;}//初始化server_addrmemset(&server_addr,0, sizeof(server_addr));memset(&server_addr,0, sizeof(server_addr));//初始化服务器端的套接字,并⽤htons和htonl将端⼝和地址转成⽹络字节序server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);//ip可是是本服务器的ip,也可以⽤宏INADDR_ANY代替,代表0.0.0.0,表明所有地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//对于bind,accept之类的函数,⾥⾯套接字参数都是需要强制转换成(struct sockaddr *)//bind三个参数:服务器端的套接字的⽂件描述符,if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;}//设置服务器上的socket为监听状态if(listen(serverSocket, 5) < 0){perror("listen");return 1;}//循环接收消息、发送消息while(1){printf("监听端⼝: %d\n", SERVER_PORT);//调⽤accept函数后,会进⼊阻塞状态//accept返回⼀个套接字的⽂件描述符,这样服务器端便有两个套接字的⽂件描述符,//serverSocket和client。
Socket通信基本流程
Tcp通信基本流程:
服务器端 客户端
1.创建socket 1.创建socket
2.bind()
3.listen()
4.accecp()
----等待客户端连接---- 2.connect()
5.读数据(recv) 3.写数据(send)
6.写数据(send) 4.读数据(recv)
7.关闭socket(closesocket()) 5.关闭socket(closesocket())
Udp通信基本流程:
服务器端: 客户端
1.创建socket 1.创建socket
2.bind() 2.bind()
3.recvfrom
----等待连接---- 3.sendto()
4.sendto() 4.recvfrom()
5.关闭socket(closesocket()) 5.关闭socket(closesocket())