网络编程入门-实现服务器与客户端通讯

概念学习

TCP概念:
TCP(Transmission Control Protocol)协议指的是传输控制协议,是一个面向连接的传输协议,他是一个能提供高可靠性的通信协议,所谓高可靠性指的是数据无丢失、数据无误、数据无失序、数据无重到达。(打电话)
适用场景:
适用于对传输质量要求较高,以及传输大量数据的通信。
在需要传输可靠数据的场合通常会选择使用TCP通信协议。
比如QQ/微信/支付宝等通信软件的账户登录和支付相关功能是通常采用可靠的TCP通信协议来实现。
UDP概念:
UDP(User Datagram Protocol)指的是用户数据报协议,是一种不可靠无连接的协议,在数据发送前,不需要提前建立连接,所以可以更高效地传输数据。(发邮件)

适用场景:
发送小尺寸地数据(例如对DNS服务器进行地址查询或路游器更新路由表)
在收到数据,给出应答比较困难地网络中适用UDP(比如无线网络)
适用于广播/组播式通信。
QQ/微信等即时通信软件地点对点文件通讯以及音视频通话时。
流媒体、VoIOP、IPTV等网络多媒体服务中(直播间)

 相关API函数

UDP相关API

创建一个待连接套接字socket

1 #include <sys/socket.h>
2 int socket(int domain, int type, int protocol);
3 参数:
4 domain:域。
5 AF_INET/PF_INET: 网际协议
6 AF_UNIX/PF_UNIX:本地协议,可写成 AF_LOCAL/PF_LOCAL7 type:类型。
8 SOCK_STREAM:流式套接字 TCP协议
9 SOCK_DGRAM:数据报套接字 UDP协议10 protocol:协议。
11 一般为 012 返回值:
13 成功:待连接套接字
14 失败:-1

绑定地址: 

#include <sys/types.h>
#include <sys/socket.h>1 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
2 参数:
3 sockfd:待连接套接字
4 addr:包含本地地址(IP+PORT)的通用地址结构体的指针
5 addrlen:地址结构体大小6 返回值:
7 成功:0
8 失败:-1

 地址结构体

我们要么用IPV4或IPV6,因为直接使用通用结构体来配置不方便,再将IPV4或IPV6的结构体强转为通用结构体。

 struct sockaddr // 通用IP信息结构体{sa_family_t sa_family;char sa_data[14];}struct sockaddr_in // IPV4地址结构体{u_short sin_family;// 地址族(网际协议/本地协议)u_short sin_port;// 端口(65000 以上)struct in_addr sin_addr;// IPV4 地址(ifconfig可以查看)char sin_zero[8];//暂时不管不知道干嘛的};struct in_addr // IP地址结构体{in_addr_t s_addr;// 无符号 32 位网络地址};

发送数据到UDP:

1 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
2 const struct sockaddr *dest_addr, socklen_t addrlen);
3 参数:
4 sockfd:UDP 套接字
5 buf:即将发送的数据
6 len:数据的长度
7 flags:发送标志,与函数 send 的 flags 完全一致
8 dest_addr:对端网络地址
9 addr_len:地址长度
10 返回值:
11 成功:已发送字节数
12 失败:-1

从UDP中接收数据:

1 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
2 struct sockaddr *src_addr, socklen_t *addrlen);
3 参数:
4 sockfd:UDP 套接字
5 buf:储存数据缓冲区
6 len:缓冲区大小
7 flags:接收标志,与函数 send 的 flags 完全一致
8 src_addr:对端网络地址
9 addrlen:地址长度
10 返回值:
11 成功:已接收字节数
12 失败:返回-1

UDP通信过程:

程序实现

UDP通讯

服务端

服务端实现思路:就好比寄邮件

第一步:我们需要一个放邮件的邮箱(创建套接字,socket()函数)

第二步:我们要标注将这个邮件发往什么地方(用IPV4地址结构体标注这个套接字的去向信息比如:IP地址、端口号、那种协议)

第三步:将邮件和标注信息绑定起来(bind()函数)

第四部:将邮件进行发送 (recvfrom()函数)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>  //这个结构体包含了地址结构体的声明
#include <netinet/in.h>int main()
{
//1、创建信箱(套接字)
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == socket_fd)
{perror("socket err");  return -1;                  
}//2、设置信箱地址和端口号
//设置信箱地址
/*struct sockaddr_in // IPV4地址结构体{u_short sin_family;// 地址族(网际协议/本地协议)u_short sin_port;// 端口(65000 以上)struct in_addr sin_addr;// IPV4 地址(ifconfig可以查看)char sin_zero[8];//暂时不管不知道干嘛的};*/
struct sockaddr_in my_sockaddr = {0};
my_sockaddr.sin_family = AF_INET;
my_sockaddr.sin_port = htons(65000);//用函数将主机字节序转换为网络字节序才能进行茶传输
//in_addr_t inet_addr(const char *cp);
my_sockaddr.sin_addr.s_addr = inet_addr("192.168.80.128");int len = sizeof(struct sockaddr_in);
//3.把设置好的信息与信箱进行绑定
int ret_val = bind(socket_fd, (struct sockaddr *)&my_sockaddr, len);
if(-1 == ret_val)
{perror("bind error");return -1;
}
//4.等待客户端来信
//先让一直等待接受
char * msg = calloc(128,1);//存储接收到的信息
struct sockaddr_in src_addr;//将接收到的套接字存放在此处
while(1)
{ssize_t ret_val = recvfrom(socket_fd, msg, 128, 0,(struct sockaddr *)&src_addr, &len);if(-1 == ret_val){perror("recvfrom error");continue;}else{printf("recvfrom succeed,msg:%s\n",msg);//如果需要打印别的信息src_addr,这个结构体里将数据进行转换显示printf("addr:%s\n",inet_ntoa( src_addr.sin_addr ));//显示发送者的IP地址printf("addr:%s\n",inet_ntoa( src_addr.sin_addr ));}
}return 0;
}

客户端

客户端不要将信件和信件的去向信息进行绑定,客户端是发送信息

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>  //这个结构体包含了地址结构体的声明
#include <netinet/in.h>int main()
{
//1、创建信箱(套接字)
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == socket_fd)
{perror("socket err");  return -1;                  
}//2、设置信箱地址和端口号
//设置信箱地址
/*struct sockaddr_in // IPV4地址结构体{u_short sin_family;// 地址族(网际协议/本地协议)u_short sin_port;// 端口(65000 以上)struct in_addr sin_addr;// IPV4 地址(ifconfig可以查看)char sin_zero[8];//暂时不管不知道干嘛的};*/struct sockaddr_in my_sockaddr = {0};
my_sockaddr.sin_family = AF_INET;
my_sockaddr.sin_port = htons(65000);//用函数将主机字节序转换为网络字节序才能进行茶传输
//in_addr_t inet_addr(const char *cp);
my_sockaddr.sin_addr.s_addr = inet_addr("192.168.80.128");int len = sizeof(struct sockaddr_in);//4.等待客户端来信
//先让一直发送
char * msg = calloc(128,1);
int ret_val = -1;while(1)
{printf("请输入的消息为:\n");fgets(msg,128,stdin);ret_val = sendto(socket_fd, msg, strlen(msg), 0,(struct sockaddr *)&my_sockaddr, len);if(-1 == ret_val){perror("sendto error");continue;}else{printf("sendto succeed %d byte! \n",ret_val);}
}return 0;
}

实验结果

两个端口之间可以进行通讯 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419860.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Keil导入包出错

1.菜单栏找不到GD系列&#xff1f; 随便新建一个工程&#xff0c;将project用记事本打开后如图2所示。再将别人给的代码工程用记事本打开&#xff0c;发现别人给的工程少了这两行&#xff0c;所以复制粘贴到别人给的工程记事本中&#xff0c;保存刷新后重新打开&#xff0c;就…

剑指offer JZ23 链表中环的入口结点

问题描述&#xff1a; 给定一个长度为n的链表&#xff0c;首先判断其是否有环&#xff0c;然后找到环的入口。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度 O(n)。 思路&#xff1a; 1. 投机一点的做法 从头遍历链表&#xff0c;如果有环&#xff0c;那么有些节…

解读:以RTC为基,AI为脑的“超拟人”AI实时互动解决方案

我们打造了一款满足想象与应用的智能体——AI实时互动。 谈谈AI智能体 当AI变得足够聪明时&#xff0c;用户与AI的交互将变得真实自然。于是&#xff0c;构建高拟真AI与用户的实时交互&#xff0c;已经成为企业提升数智化生产力的新思路。 在这个交互过程中&#xff0c;存在一…

@开发者极客们,网易2024低代码大赛来啦

极客们&#xff0c;网易云信拍了拍你 9月6日起&#xff0c;2024网易低代码大赛正式开启啦&#xff01; 低代码大赛是由网易主办的权威赛事&#xff0c;鼓励开发者们用低代码开发的方式快速搭建应用&#xff0c;并最终以作品决出优胜。 从2022年11月起&#xff0c;网易低代码大赛…

python_openCV_计算图片中的区域的黑色比例

希望对原始图片进行处理&#xff0c;然后计算图片上的黑色和白色的占比 上图&#xff0c; 原始图片 import numpy as np import cv2 import matplotlib.pyplot as pltdef cal_black(img_file):#功能&#xff1a; 计算图片中的区域的黑色比例#取图片中不同的位置进行计算&…

Qt:关于使用player->state()导致的程序崩溃

前言 最近想做一个白噪声播放器&#xff0c;中间就用到了QMediaplayer这个类&#xff0c;其中遇到两个问题&#xff0c;一个是调用player->duration()第一次获取媒体时长为0的问题(这个问题留到下一个文章去说)&#xff1b;还有一个就是未初始化好就调用player->state()…

解决Win10版Township进度保存问题

解决Win10版Township进度保存问题 问题描述问题分析解决步骤1.WinR打开运行&#xff0c;输入regedit点击确定打开注册表2.进入注册表“计算机\HKEY_CURRENT_USER\Software\Classes\LocalSettings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings”目录3.在这…

逆向学习系列(一)安装模拟器

从今天开始&#xff0c;学习逆向APP的知识并记录。 首先&#xff0c;从最简单的环境搭建开始&#xff0c;我的环境&#xff08;LENOVO&#xff09;&#xff0c;win7&#xff0c;64位。 &#xff08;一&#xff09;安装mumu模拟器。 官网地址&#xff1a;MuMu模拟器官网_安卓…

【idea】设置文件模板

搜索 File and Code Templates 。 添加模板。 在任意文件目录下右键&#xff0c;new->找到添加的模板。 参考链接&#xff1a; IDEA创建模板文件_edit file templates-CSDN博客

Rocketmq 概述消息队列的应用场景

Message Queue &#xff08;消息 队列&#xff09;&#xff0c;从字⾯上理解&#xff1a;⾸先它是⼀个队列。 FIFO 先进先出的数据结构—— 队列。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的&#xff0c;解决的是通信问题。 先来看看没有使用…

rancher搭建k8s及jenkins自动化部署

1、准备环境 角色IP用途k8s-rancher-master192.168.3.63master节点k8s-rancher-node01192.168.3.64node节点k8s-rancher-node02192.168.3.66node节点k8s-rancher-server192.168.2.33rancher-server节点注: 服务器名需要配置不同,相同服务器名不能加入node节点 在所有节点进行…

海外直播对网速、带宽、安全的要求

要满足海外直播的要求&#xff0c;需要拥有合适的网络配置。在全球化的浪潮下&#xff0c;海外直播正逐渐成为企业、个人和各类组织的重要工具。不论是用于市场推广、品牌宣传&#xff0c;还是与观众互动&#xff0c;海外直播都为参与者带来了丰富的机会。然而&#xff0c;确保…

【小项目】python贪吃蛇小游戏设计

引入pygame库 添加pygame库&#xff0c;在cmd中输入以下代码&#xff0c;进行安装。如果输入pip install pygame出现以下报错&#xff0c;可以尝试在前面加入python3 -m。 python3 -m pip install pygame 贪吃蛇代码 import pygame import time import random# 初始化 Pygam…

【原创】java+springboot+mysql学生信息管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

IQ Tools---Radar Pulses/Chirps

本文将详细介绍IQ Tool中的Radar Pulses/Chirps模块的使用方法和实现原理。 1. 参数配置 图1. Radar Pulses/Chirps参数配置界面 该模块可配参数如下&#xff1a;   (1) Sample Rate(Hz): 系统采样率&#xff0c;单位:Hz   (2) Repeat interval(s): 脉冲重复周期&#xff…

数据库类型有哪些?

根据存储方式的不同&#xff0c;数据库可以分为不同种类。每种类型的数据库&#xff0c;都有各自使用场景以及不同的产品。 ​ 关系型数据库 关系型数据库&#xff08;RDBMS&#xff09;基于关系模型&#xff0c;通过表&#xff08;Table&#xff09;的形式来组织数据&#xf…

java中普通代码块和静态代码块之间的区别(java小知识点)

文章目录 1.普通代码块&#xff08;实例代码块&#xff09;1.1用法 2.静态代码块2.1用法 3.总结 1.普通代码块&#xff08;实例代码块&#xff09; 实例代码块是一段未包含在任何方法或构造器中的代码。它再每次创建类的实例时候执行&#xff0c;并且优先于构造器执行. 用途一般…

照片删除了怎么恢复回来?要学会这些数据恢复方法

在数字化时代&#xff0c;照片已经成为我们记录生活、珍藏回忆的重要载体。然而&#xff0c;有时由于误操作或其他原因&#xff0c;我们可能会不小心删除了重要的照片。面对这种情况&#xff0c;很多人会感到焦虑和无助。幸运的是&#xff0c;有多种方法可以帮助我们恢复删除的…

【项目功能扩展】在线网站 -用户管理功能(用户注册登录修改等、利用cookie存储用户会话状态)

文章目录 0. 前言开发环境 & 涉及技术 1. 宏观结构2. 后端部分① sqlite 管理类② user 管理类 3. 前端部分&#xff08;与后端交互&#xff09;① 登录② 注册③ 查看登录用户的信息④ 更新用户信息⑤ 登出用户 & 注销用户注意 效果演示 0. 前言 源码链接&#xff1a…

Java | Leetcode Java题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isRectangleCover(int[][] rectangles) {long area 0;int minX rectangles[0][0], minY rectangles[0][1], maxX rectangles[0][2], maxY rectangles[0][3];Map<Point, Integer> cnt new HashM…