首页 > 编程语言 >网络编程之流式套接字

网络编程之流式套接字

时间:2024-03-27 21:59:30浏览次数:30  
标签:SOCKADDR sockClient 编程 流式 地址 接字 addrServer 客户端

流式套接字(SOCK_STREAM)是一种网络编程接口,它提供了一种面向连接的、可靠的、无差错和无重复的数据传输服务。这种服务保证了数据按照发送的顺序被接收,使得数据传输具有高度的稳定性和正确性。通常用于那些对数据的顺序和完整性有严格要求的应用。通常由传输控制协议(TCP)来实现。TCP协议通过建立连接、数据分包的编号和确认、以及重传机制等方式来确保数据的可靠传输。尽管这种服务提供了高度的可靠性,但它也可能导致较高的网络资源占用率。

 客户端代码

//客户端
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")//告诉链接器将 ws2_32.lib 这个库文件链接到可执行文件中,以便使用 Windows Sockets API
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET sockClient;//客户端Socket
SOCKADDR_IN addrServer;//服务端地址
WSAStartup(MAKEWORD(2,2),&wsaData);
sockClient=socket(AF_INET,SOCK_STREAM,0);//创建一个TCP类型的流式Socket。AF_INET指定使用IPv4协议

//定义要连接的服务端地址
addrServer.sin_family=AF_INET;
addrServer.sin_addr.s_addr=inet_addr("127.0.0.1");//127.0.0.1是本地环回地址,因为这里客户端和服务端在同一个主机上
addrServer.sin_port=htons(6000);//连接端口6000

//连接到服务端
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//发送数据
char message[30]="Hello Socket!";//准备要发送的消息,字符串长度限制在 30 字节以内。
send(sockClient,message,strlen(message)+1,0);//要发送的消息的长度,包括字符串结尾的空字符,以确保接收方能正确地识别字符串的结束0。


//关闭socket
closesocket(sockClient);
WSACleanup();
printf("success!\n");//简单的打印输出,表示程序正常运行
return 0;
}

服务端代码 

//服务端
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main(int argc, char* argv[]) {
    WSADATA wsaData;
    SOCKET sockServer;
    SOCKADDR_IN addrServer;
    SOCKET sockClient;
    SOCKADDR_IN addrClient;
    
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    
    sockServer = socket(AF_INET, SOCK_STREAM, 0);
    addrServer.sin_addr.s_addr = INADDR_ANY;

    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(6000);//指定服务端的监听端口号为 6000。 
    
    bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));//bind函数将Socket与指定的地址和端口绑定
    listen(sockServer, 5); //开始监听连接请求,5 表示队列中最多可以容纳 5 个待处理的连接请求。
    
    printf("服务器已启动;\n监听中...\n");
    
    int len = sizeof(SOCKADDR);//用于存储客户端地址信息的结构体的大小
    char recvBuf[100];//用于接收客户端发送的消息的缓冲区。

    sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len);//accept函数接受客户端的连接请求
    recv(sockClient, recvBuf, 100, 0);//接收客户端发送的消息存储在 recvBuf 中。
    printf("%s\n", recvBuf);
    
    closesocket(sockClient);//关闭与客户端的连接套接字
    closesocket(sockServer);//关闭服务端监听套接字
    
    WSACleanup();
    printf("success!\n");//表示正常运行
    return 0;
}

 先运行服务器,开始监听

然后运行客户端

服务器结果如下,收到客户端发来的消息Hello Socket!

套接字函数

1、socket函数:创建一个套接字

socket(AF, type, protocol);

AF:指定套接字使用的地址族,常见的值包括 AF_INET(IPv4 地址族)和 AF_INET6(IPv6 地址族)

type:套接字类型,可选SOCK_STREAM(流式套接字),和 SOCK_DGRAM(数据报套接字)

protocol:指定套接字使用的协议,通常设置为默认0

例如本实验创建一个IPv4 地址族的流式套接字

socket(AF_INET,SOCK_STREAM,0)

2、bind函数:将一个套接字与一个IP地址绑定在一起。

bind(s, sockaddr *name, int namelen)

s:要绑定地址的套接字变量。

name:指向包含地址信息的 sockaddr 结构体的指针。

namelen:name 结构体的长度

客户端套接字在发出连接请求后,由内核自动绑定到一个临时端口和地址上,所以不需要这个函数。而作为服务器,一般是工作在被动连接的方式下,所以必须通过显示的调用bind()将监听套接字绑定到一个端口上,以等待客户端的连接。

例如本实验将套接字sockServer绑定地址为&addrServer上的信息

bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR))

3、listen函数:将指定的套接字设置为监听状态

listen(s, max)

s:要设置为监听状态的套接字变量

max:等待连接队列的最大长度

例如本实验将sockServer设置为监听模式,最多可以同时连接5个客户端

listen(sockServer, 5)

4、connect函数:用于将套接字连接到指定的目标地址

connect(s, sockaddr *name, namelen)

s:请求连接的套接字变量

name: sockaddr 结构体的指针,包含了要连接的目标地址和端口信息

namelen:name 结构体的长度

例如本实验请求连接的套接字是sockClient,要连接的目的地址是&addrServer

connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR))

5、accept 函数:用于接受客户端的连接请求,并创建一个新的套接字来与客户端进行通信。

accept(s, sockaddr *addr, int *addrlen)

s:处于监听状态的套接字

addr:存储客户端地址信息的指针

addrlen:指向一个整数变量的指针,用于存储客户端地址信息的结构体的长度。需要将addrlen设置为 sizeof(struct sockaddr)

例如本实验sockServer处于监听状态,客户端地址为addrClient

sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len)

6、send函数:向已连接的套接字发送数据

send(s, buf, len)

s:发送数据的套接字变量。

buf:指向要发送数据的缓冲区的指针。

len:要发送的数据的长度(以字节为单位)。

调用 send 函数后,它会将指定长度的数据从缓冲区 buf 发送到套接字 s 所连接的目标。

例如本实验sockClient发送数据长度为strlen(message)+1的数据

send(sockClient,message,strlen(message)+1,0)

7、recv函数:用于接收通过已连接套接字传输的数据

recv(s, buf, len)

s:要接收数据的套接字变量

buf:指向接收数据的缓冲区的指针

len:缓冲区长度,即接收数据的最大长度

例如本实验接收sockClient发到recvBuf缓冲区的信息

recv(sockClient, recvBuf, 100, 0)

8、closesocket函数:用于关闭套接字,被关闭的套接字不能再用于任何操作

closesocket(s)

客户端:socket() --> connect() --> send() --> recv() --> close()

服务端:socket() --> bind() --> listen() --> accept() --> recv() --> close()

send函数可以用write函数代替,recv 函数可以用write函数代替,但是send函数和recv函数能在跨平台的网络编程中使用,所以建议使用send和recv以确保更好的可移植性和兼容性。

结构体

1、sockaddr结构体

struct sockaddr {

    unsigned short sa_family; // 地址族,地址的类型,如 AF_INET、AF_INET6

    char sa_data[14]; // 地址数据

};

2、sockaddr_in结构体

struct sockaddr_in {

    short sin_family;           // 地址族,通常设置为 AF_INET(IPv4)

    unsigned short sin_port;    // 端口号,网络字节序

    struct in_addr sin_addr;    // IP地址

    char sin_zero[8];           // 保留字段,通常填充0

};

3、in_addr结构体

struct in_addr {

    unsigned long s_addr;  // 存储 IPv4 地址的 32 位整数,采用网络字节序

};

4、SOCKET结构体

用于声明套接字变量,然后再将这个变量传入套接字函数进行操作

5、WSADATA 结构体

初始化变量,然后将该变量传入WSAStartup()函数,该函数的作用是初始化 Windows Sockets API。告知系统将要使用的套接字库的版本号。如MAKEWORD(2, 2)表示使用版本号为 2.2 的套接字库,程序执行完后使用WSACleanup()函数释放Winsock库的资源

标签:SOCKADDR,sockClient,编程,流式,地址,接字,addrServer,客户端
From: https://blog.csdn.net/m0_62574258/article/details/137090774

相关文章

  • 13DOM编程API(一)
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Do......
  • 15DOM编程API(三)
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • 14DOM编程API(二)
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • Python篇之网络编程,实现简单的服务端和客户端的内容传输
    本小节内容:实现简单的信息交流文章目录一、Socket介绍二、客户端与服务端三、在python中实现网络通信1.服务端2.客户端3.连接测试一、Socket介绍socket(简称套接字)模块是其内置的标准库之一,它实现了BSDsocketsAPI,允许开发者在Python程序中进行网络通......
  • 语法回顾-《Verilog编程艺术》之数据类型
    目录线网(net)变量(variable)线网和变量的区别向量数组参考《Verilog编程艺术》魏家明著线网(net)用于表示结构体(如逻辑门)之间的连接。除了trireg之外,所有其他的线网类型都不能保存值,线网的值是由driver决定的。例如由连续赋值驱动或由逻辑门驱动。如果driver没有驱动线......
  • 语法回顾-《Verilog编程艺术》之Verilog特性
    目录Verilog标准:抽象级别:行为级模型:RTL级模型:门级模型:可综合子集:参考《Verilog编程艺术》魏家明著Verilog标准:Verilog一共发行了三个标准:Verilog-1995、Verilog-2001和Verilog-2005.抽象级别:Verilog可以在三种抽象级上进行描述:行为级模型,RTL级模型和门级模型。......
  • 《python编程从入门到实践》 Sublime中运行程序提示“Python was not found but can b
    安装过程1.安装python32.安装SublimeText①下载②让SublimeText使用命令python3来运行Python程序3.运行①新建helloworld②运行遇到的问题执行以上步骤后:1.搜索解决方法2.关掉后执行3.更改buildsystem方式python3改为python,执行,成功备注:发现保持应用打开......
  • 1.编程介绍
    【一】编程和编程语言1.编程​ 将人类的语言转变成计算机能识别的语言2.编程语言​ 人与计算机之间进行沟通的语言3.目的​ 为了让计算机按照人类的意愿完成特定的任务,实现自动化,提高工作效率,解放人力,创造应用与软件【二】计算机组成原理1)计算机的五大组成部分1.控制器......
  • HTML编程+函数的调用1
    原创:财院网站设计学习平台1.函数无参数<body><inputtype="submit"value="输入显示信息的次数:"onclick="showHello()"/><script>functionshowHello(){varcount=prompt("请输入显示信息的次数:");for(vari=1;i<=count;i++){......
  • FUSB302BMPX 可编程USB芯片控制器 接口集成电路 302B Type-C Control IC with PD
    FUSB302BMPX是一种可编程的USBType-C控制器,由安森美半导体公司生产。它支撑USBType-C检测,包含衔接和方向,并集成了USBBMC功率输送协议的物理层,可完成高达100W的电源和角色交换。该控制器适用于希望完成DRP/SRC/SNKUSBType-C衔接器的系统规划人员。此外,FUSB302BMPX支撑USB3......