C语言实现-----网络通信

C语言实现-----网络通信

网络编程就是编写程序使两台联网的计算机相互交换数据。

一 、基本原理

  • 服务器端步骤:建立 socket,绑定 socket 和地址信息,开启监听,
    收到请求后发送数据。
  • 客户端步骤:建立 socket,连接服务器端,接收并打印服务器给
    的数据。

二、流程图:

在这里插入图片描述

三、核心函数包含:

  1. socket:创建一个 socket;
  2. bind:用于绑定 IP 地址和端口号到 socket;
  3. listen: 设置能处理的最大连接要求,listen()并未开始接收连线,
  4. 只是设置 socket 为 listen 模式;
  5. accept:用来接受 socket 连接。
  6. connect: 该函数用于绑定之后的 client 端与服务器建立连接;

四、函数介绍

1、socket 函数(套接字)

socket 的原意是“插座”,在计算机通信领域,Socket 被翻译
为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通
过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可
以向其他计算机发送数据。

基本语法:SOCKET socket(int af, int type, int protocol);

参数说明:

af:地址族,值包含 AF_INET(IPv4)AF_INET6(IPv6 );

type:数据传输方式/套接字类型,值包含 SOCK_STREAM(流格式套接字/面向连接的套接字)SOCK_DGRAM(数据报套接字/无连接的套接字);

protocol:传输协议,值包含 IPPROTO_TCP(TCP 传输协议)IPPROTO_UDP(UDP 传输协议)

2、bind 函数(绑定数据对象)

将套接字与特定的IP地址和端口绑定起来,只有这样,流经该 IP
地址和端口的数据才能交给套接字处理。

基本语法:int bind(SOCKET sock, const struct sockaddr *addr,int addrlen);

参数说明:
socket:服务器套接字对象;
addr:sockaddr 结构体变量的指针;
addrlen:为 addr 变量的大小;

3、listen 函数(监听)

让套接字进入被动监听状态。

基本语法:int listen(SOCKET socket,int backlog);

参数说明:
socket:服务器套接字对象(进入监听状态);
backlog:请求队列的最大长度;

4、accept 函数(接收)

当套接字处于监听状态时,可以通过 accept() 函数来接收客户
端请求。accpet()函数返回一个新的套接字来和客户端通信.

基本语法:SOCKET accept(SOCKET sock, struct sockaddr *addr,int *addrlen);

参数说明:
socket:服务器套接字对象;
addr:sockaddr_in 结构体变量;
addrlen: addr 的长度;

5、connect 函数(连接服务器)

将套接字与服务器端的 IP 地址和端口绑定起来建立连接。

基 本 语 法 :int connect(SOCKET sock, const struct sockaddr*servaddr, int addrlen));

参数说明:
sock:客户端套接字对象;
servaaddr:sockaddr 结构体变量的指针;
addrlen:为 addr 变量的大小;

6、send 函数(数据发送)

专门的发送数据的函数。

基本语法:int send(SOCKET sock, const char *buf, int len, int flags);

参数说明:
sock:要发送数据的套接字对象;
buf:要发送的数据的缓冲区地址;
len:为要发送的数据的字节数;
flags:为发送数据时的选项,参数值一般设置为 0NULL

7、recv 函数(数据接收)

专门的接收数据的函数。

基本语法:int recv(SOCKET sock, const char *buf, int len, int flags);
参数说明:
sock:要接收数据的套接字对象;
buf:要接收的数据的缓冲区地址;
len:为要接收的数据的字节数;
flags:为接收数据时的选项,参数值一般设置为 0NULL

8、sockaddr_in 结构体

struct sockaddr_in 结构体用来处理网络通信的地址。

基本语法:
struct sockaddr_in{
   
sa_family_t sin_family; //地址族(Address Family),也就是地址类型
uint16_t sin_port;<
  • 24
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
N-ARQ(即“n”个自动重传请求)是一种数据通信协议,它在传输数据时使用自动重传请求来提高数据传输的可靠性。下面是一个简单的示例代码,演示了如何使用C语言实现N-ARQ协议。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define PACKET_SIZE 1024 #define TIMEOUT 5 // 模拟网络传输 int transmit(char *packet, int size) { // 模拟网络延迟 int delay = rand() % 10; // 模拟传输错误 int error = rand() % 10; if (error < 5) { // 传输成功 return delay; } else { // 传输失败 return -1; } } // N-ARQ协议的实现 void n_arq(char *data, int size) { int seq = 0; int ack = 0; int resend = 0; int timeout = 0; int delay = 0; char packet[PACKET_SIZE]; while (ack < size) { if (seq < size) { // 发送数据包 printf("Sending packet %d\n", seq); memcpy(packet, data + seq, PACKET_SIZE); delay = transmit(packet, PACKET_SIZE); if (delay < 0) { // 传输失败,需要重新发送 printf("Packet %d lost, resending...\n", seq); resend++; continue; } seq += PACKET_SIZE; timeout = 0; } // 接收ACK delay = transmit("ACK", 3); if (delay < 0) { // ACK丢失,需要重新发送 printf("ACK lost, resending...\n"); resend++; continue; } ack += PACKET_SIZE; // 超时处理 if (timeout > TIMEOUT) { printf("Timeout, resending packet %d...\n", seq - PACKET_SIZE); resend++; timeout = 0; } else { timeout += delay; } } printf("Transmission complete, %d packets resent.\n", resend); } int main() { // 生成随机数据 char data[1024 * 10]; srand(time(NULL)); for (int i = 0; i < sizeof(data); i++) { data[i] = rand() % 256; } // 使用N-ARQ协议传输数据 n_arq(data, sizeof(data)); return 0; } ``` 上面的代码实现了一个简单的N-ARQ协议,它将数据分成了多个固定大小的数据包,并在传输数据包时使用自动重传请求来提高传输的可靠性。在实际应用中,N-ARQ协议通常会使用更复杂的机制来提高传输的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值