【Linux网络编程】套接字Socket

news2025/3/11 0:22:03

网络编程基础概念:

ip地址和端口号

ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx    xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个主机可以有多个ip地址,一个ip地址只能被一个主机占用。

端口号 (port) 是传输层协议的内容。
端口号是一个2字节16位的整数。
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理。
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程。
一个端口号只能被一个进程占用

仅使用主机的ip地址就可以实现两主机中不同的应用进程进行网络通信吗?不可以。ip地址只是锁定要向那个主机发送信息,要想进行不同主机之间应用进程间的网络通信就必须要有端口号。比如你的手机相当于是一个客户端主机,手机里有聊天应用、短视频应用、游戏等各种应用,当你进入游戏时你的客户端会向游戏服务端发送请求,此时游戏服务端必须要有唯一的你的手机中该游戏应用的端口号,否则仅凭ip地址游戏服务端可能会将响应发送给你的手机的其他应用。

网络层协议的IP 数据报头部中 , 有两个 IP 地址 , 分别作源 IP 地址和目的 IP 地址。
传输层协议 (TCP UDP) 的数据段中有两个端口号 , 分别叫做源端口号和目的端口号都是描述 " 数据是谁发的 , 要发给谁 "。

网络字节序

内存中的多字节数据相对于内存地址有大端和小端字节序之分。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节进行传输。
不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据。
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送就可以。
将数据转换为网络字节序的函数:

套接字(Socket)是一种独立于协议的网络编程接口。对网络中不同主机上的应用程序之间进行双向通信的端点的抽象,一个套接字就是网络中进程通信的一端,为应用层进程提供利用网络协议交换数据的机制。套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口、是应用程序与网络协议栈进行交互的接口。网络字节序

创建套接字:

主机信息与套接口之间进行绑定:

 对于服务端需要我们显式绑定,而对于客户端操作系统会自动绑定。

服务端/客户端向服务端/客户端发送消息:

 服务端/客户端接收信息:

 

可以清空数据类型变量的函数bzero:

sockaddr_in结构体中的in_addr结构体类型源代码定义:

 结构体sin_addr里包含了主机ip地址:

INADDR_ANY是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。

基于UDP 客户端多线程:

UdpClient.cxx

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>

// 客户端基于多线程向服务端收发消息

#define SIZE 1024
void UsageMethod(const std::string &str)
{
    std::cout << str << "ser ip   ser port" << std::endl;
}

void *SendMessage(void *args)
{
    serverdata *svdata = static_cast<serverdata *>(args);
    std::string info; // 给服务端发信息所用的缓存区
    while (true)
    {
        std::cout << "Please Enter:";
        std::getline(std::cin, info);
        socklen_t len = sizeof(svdata->_server);
        sendto(svdata->_sockfd, info.c_str(), info.size(), 0, (const sockaddr *)&(svdata->_server), len);
    }
    return nullptr;
}

void *ReceiveMessage(void *args)
{
    serverdata *svdata = static_cast<serverdata *>(args);
    char inbuffer[SIZE] = {0};
    while (true)
    {
        struct sockaddr_in svtmp;
        socklen_t len = sizeof(svtmp);
        recvfrom(svdata->_sockfd, inbuffer, sizeof(inbuffer) - 1, 0, (sockaddr *)&(svdata->_server), &len);
        std::cout << "client get message:" << inbuffer << std::endl;
    }
}

struct serverdata
{
    struct sockaddr_in _server;
    int _sockfd;
};
int main(int argc, char *argv[]) // 客户端不需要显式bind 端口号 和 ip地址
{
    if (argc != 3)
    {
        UsageMethod(argv[0]);
        exit(0);
    }
    std::string serverip = argv[1];
    std::string serverport = argv[2];

    // 服务端信息
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(serverip.c_str());
    auto port = std::stoi(serverport.c_str()); // 先将string类型的port转换为uint16_t类型以满足函数传参
    server.sin_port = htons(port);

    // 创建客户端的套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket error");
    }
    serverdata sd;
    sd._sockfd = sockfd;
    sd._server = server;

    // 创建线程
    pthread_t sender, receiver;
    pthread_create(&sender, nullptr, SendMessage, &sd); // 先客户端发送信息的线程
    pthread_create(&receiver, nullptr, ReceiveMessage, &sd);

    //等待线程
    pthread_join(sender, nullptr);
    pthread_join(receiver, nullptr);
    close(sockfd);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【赛事】2024第五届“华数杯”全国大学生数学建模竞赛

为了培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力&#xff0c;天津市未来与预测科学研究会、中国未来研究会大数据与数学模型专业委员会&#xff08;协办&#xff09;决定举办华数杯全国大学生数学建模竞赛。竞赛的目标是为培养大学生的科学精神及运用数学…

精准识别,无缝转换:2024年顶尖语音转文字技术展示

高效、准确的信息传递与处理成为了我们工作与生活中的重要需求。随着科技的飞速发展&#xff0c;一项革命性的技术——语音转文字软件应运而生。掌握这项技术就能提高工作效率创造更多价值。 1.365在线转文字 链接传送&#xff1a;www.pdf365.cn/ 这个方式虽然不是软件&am…

《四季之歌:春溪潺潺、夏林舞动、秋山守望、冬夜温光》

在这个喧嚣的世界里&#xff0c;有时我们会渴望逃离&#xff0c;去寻找那些安静而纯净的自然角落。每个季节都有它独特的魅力&#xff0c;它们像是大自然精心谱写的交响乐章&#xff0c;我们只需细心聆听&#xff0c;就能感受到四季变换带来的无尽奇境。 春天的序曲&#xff0c…

政企互动 | 南京市雨花台区委副书记王金玉一行莅临聚铭网络视察指导

7月30日&#xff0c;南京市雨花台区委副书记王金玉一行领导莅临聚铭网络进行实地考察与指导。聚铭网络总经理唐开达先生热情接待&#xff0c;双方就聚铭网络的发展现状、业务规模及未来规划展开了深入而愉快的交流。 在唐开达总经理的悉心陪同下&#xff0c;王书记一行深入聚铭…

前后端完全分离实现登录和退出

前后端分离的整合 使用springsecurity前端项目redis完成认证授权的代码 1. 搭建一个前端工程 使用 vue ui搭建&#xff0c;使用webstrom操作 2. 创建一个登录页面 <template><div class"login_container"><!-- 登录盒子 --><div class"l…

深度学习中五种归一化原理

调用库API实现以及手写实现 import torch import torch.nn as nnbatch_szie2 #sample time_steps3 embedding_dim4 #channel num_group2inputxtorch.randn(batch_szie,time_steps,embedding_dim)# N*L*C 批归一化 BatchNorm1d ## 1. 批归一化 实现batch_norm并验证API --…

2024年钉钉杯大学生大数据挑战赛倒计时,最后冲刺

2024第三届钉钉杯大学生大数据挑战赛倒计时&#xff0c;小编给大家带来非常实用的最后冲刺助力【A题】&#xff0c;&#xff08;看图资料预览&#xff09;&#xff1a; 中国烟草行业作为国家税收和财政收入的重要支柱&#xff0c;近年来销售收入持续增长。国家对此实行严格的专…

C++跳跃表个人理解

一、概念 跳跃表是一种基于有序链表的扩展&#xff0c;简称跳表&#xff0c;其就是使用关键节点作为索引的一种数据结构。 可以通过以下方式更快查找到有序链表的某一节点&#xff1a; 利用类似索引的思想&#xff0c;提取出链表中的部分关键节点。比如&#xff0c;给定一个…

C语言 ——— 指针笔试题(中篇)

指针加减整数和解引用的笔试题 笔试题1&#xff1a; int a[5][5]; int(*p)[4]; p a;printf("%p %d", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);问&#xff1a;打印的结果为&#xff1f;&#xff08;分别以 %d 和 %p 的形式打印&#xff09; …

十六、maven git-快速上手(智慧云教育平台)

&#x1f33b;&#x1f33b; 目录 一、概述及项目管理工具介绍1.1 项目介绍1.2 maven 介绍及其配置1.2.1 maven 介绍1.2.2 maven 下载与配置 1.3 pom 中常见标签的使用1.4 后端项目环境的搭建1.5 Git 简介1.6 Git 的基本使用1.6.1 码云的注册与仓库创建1.6.2 上传代码到码云仓库…

【2024】InfluxDB v2 介绍和安装使用(1)

目录&#x1f4bb; 一、介绍1、时序数据库介绍特点&#xff1a;常见的时序数据库时序库受欢迎度排名 2、InfluxDB介绍**InfluxDB 1.x 和 2.0 的主要区别**InfluxDB行协议 二、docker安装 InfluxDB v2三. Web UI常用功能介绍以及使用1、页面介绍2、功能使用2.1、创建bucket2.2、…

如何设计一个测试用例

前言&#x1f440;~ 上一章我们介绍了什么是软件测试以及软件测试的一些基础概念&#xff0c;今天来聊聊如何设计一个测试用例&#xff0c;涉及到黑盒测试的测试方法 基于需求进行测试用例的设计 基于需求的具体设计方法 等价类 边界值 判定表法 正交表法 场景设计法 …

智能ai对话软件都有哪些?分享4款!

在科技日新月异的今天&#xff0c;智能AI对话软件正以前所未有的速度改变着我们的生活方式与工作模式。它们不仅仅是冷冰冰的代码堆砌&#xff0c;更是拥有理解、学习乃至创造能力的智能伙伴&#xff0c;为人类社会带来了前所未有的便捷与乐趣。那么&#xff0c;究竟有哪些智能…

git安装和使用(托管服务 分支 克隆)超细教程

先来了解一下知识 下载与安装 (默认安装,下一步即可) 下载地址&#xff1a; https://git-scm.com/download 下载完成后可以得到如下安装文件&#xff1a; 双击下载的安装文件来安装Git。安装完成后在电脑桌面&#xff08;也可以是其他目录&#xff09;点击右键&#xff0c;如…

动态规划-斐波那契数列

一. 什么是动态规划 dp一般是需要前面状态的值的问题。比如&#xff0c;解决一个问题需要很多步骤&#xff0c;且步骤之间相关联&#xff0c;后一个步骤的推导需要前一个步骤的结论。而我们所做的就是&#xff0c;将这个带求解的问题分成若干步骤&#xff0c;将每个步骤答案保…

成为git砖家(10): 根据文件内容生成SHA-1

文章目录 1. .git/objects 目录2. git cat-file 命令3. 根据文件内容生成 sha-14. 结语5. References 1. .git/objects 目录 git 是一个根据文件内容进行检索的系统。 当创建 hello.py, 填入 print("hello, world")的内容&#xff0c; 并执行 git add hello.py gi…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——1到手测试

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——1到手测试 ​ 大家好&#xff0c;今天给大家带来的是购买到小车或者说RDK X3之后直接快速体验&#xff0c;今天主要围绕官方的快速入门手册进行逐步测试 1.知识补充1 ​ 在这里首先要给新手小白补充几…

JVM结构、架构与生命周期总结

【1】JVM结构 不同厂商的JVM产品 &#xff1a; 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天&#xff0c;Java程序的运行性能早已脱胎换骨&#xff0c;已…

数据上新 | 景联文科技推出高质量方言音文对数据集,驱动方言语音大模型技术革新

中国电信人工智能研究院&#xff08;TeleAI&#xff09;正式对外发布星辰超多方言语音识别大模型。这是业内首个支持30种方言自由混说的语音识别大模型&#xff0c;也是目前国内支持最多方言的语音识别大模型。 方言语音大模型具有广泛的应用场景&#xff0c;可以应用于语音助手…

1.1.9创建应用

1.在全局配置文件下找到urls.py进行路由配置 配置路由要指明哪个应用&#xff0c;和写好模块导入的函数 2.找到路由要启动的应用&#xff0c;在应用里找到视图函数进行设计 path&#xff08;‘url模式/“&#xff0c;视图函数&#xff09; 注意第五部没有/ 1.1.110路由匹配模…