当前位置: 首页 > news >正文

Linux下Socket编程

1. Socket简介

  • Socket是什么?
    • Socket是一种进程间通信的机制,通过它应用程序可以通过网络进行数据传输。Socket提供了一种跨平台的接口,使得同样的代码可以在不同的操作系统上运行。
  • Socket类型
    • 流式套接字(SOCK_STREAM): 基于TCP协议,提供可靠的双向字节流通信。
    • 数据报套接字(SOCK_DGRAM): 基于UDP协议,提供不可靠的、无连接的通信。
    • 原始套接字(SOCK_RAW): 允许直接访问底层协议,主要用于协议开发或网络分析工具。

2. Socket编程流程

  1. 创建Socket

    int socket(int domain, int type, int protocol);

    • domain: 协议族,常用的有 AF_INET(IPv4) 和 AF_INET6(IPv6)。
    • type: 套接字类型,如 SOCK_STREAMSOCK_DGRAM
    • protocol: 通常设为 0,表示由系统自动选择合适的协议。
  2. 绑定Socket

    int bind(int sockfd, const struct sockaddr *addr,

    socklen_t addrlen);

    • 将Socket与指定的IP地址和端口绑定。
  3. 监听连接

    int listen(int sockfd, int backlog);

    • 服务器端Socket进入监听模式,backlog指定队列中允许的最大未处理连接数。
  4. 接受连接

    int accept(int sockfd, struct sockaddr *addr,

    socklen_t *addrlen);

    • 接受客户端的连接请求,创建一个新的Socket用于与客户端通信。
  5. 连接到服务器

    int connect(int sockfd, const struct sockaddr *addr,

    socklen_t addrlen);

    • 客户端Socket使用此函数连接到服务器。
  6. 发送和接收数据

    • 发送数据:

      ssize_t send(int sockfd, const void *buf, size_t len,

      int flags);

    • 接收数据:

      ssize_t recv(int sockfd, void *buf, size_t len, int flags);

  7. 关闭Socket

    int close(int sockfd);

3. 常用API详解

  • socket()

    • 功能: 创建一个新的Socket。
    • 参数:
      • domain: 地址族,常用的如 AF_INET 表示IPv4地址。
      • type: Socket类型,SOCK_STREAMSOCK_DGRAM
      • protocol: 协议编号,通常为0,由系统选择默认协议。
    • 返回值: 返回新的文件描述符,失败返回 -1
  • bind()

    • 功能: 将Socket绑定到特定的IP地址和端口。
    • 参数:
      • sockfd: 由 socket() 创建的文件描述符。
      • addr: 结构体指针,包含要绑定的地址信息。
      • addrlen: addr 的长度。
  • listen()

    • 功能: 在Socket上监听连接请求。
    • 参数:
      • sockfd: 由 socket() 创建的文件描述符。
      • backlog: 未处理连接的最大数量。
  • accept()

    • 功能: 接受连接请求,创建用于通信的新Socket。
    • 参数:
      • sockfd: 监听套接字。
      • addr: 客户端的地址信息结构体。
      • addrlen: addr 的长度。
  • connect()

    • 功能: 客户端使用此函数连接到服务器。
    • 参数:
      • sockfd: 由 socket() 创建的文件描述符。
      • addr: 服务器的地址信息。
      • addrlen: addr 的长度。
    • 返回值: 成功返回 0,失败返回 -1
  • send() 和 recv()

    • send() 用于向对方发送数据,recv() 用于接收数据。
    • 参数:
      • sockfd: 通信的套接字。
      • buf: 数据缓冲区。
      • len: 缓冲区的大小。
      • flags: 标志位,一般为0。

4. 错误处理

在Socket编程中,经常会遇到错误。通常的做法是检查函数的返回值,若为 -1 则出错,并通过 errno 查看具体的错误原因。以下是一些常见的错误:

  • EADDRINUSE: 地址已被使用。
  • EADDRNOTAVAIL: 无效的地址。
  • ECONNREFUSED: 连接被拒绝。
  • ETIMEDOUT: 连接超时。

5. 高级特性

  • 非阻塞I/O: 使用 fcntl() 设置Socket为非阻塞模式。
  • 多路复用: 使用 select()poll() 等函数同时监听多个Socket。

6. 示例代码

服务器端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int clientFd;
int serverFd;
void hand(int s){if(2 == s){//7 断开连接close(clientFd);close(serverFd);printf("bye bye 了勾八!\n");exit(1);}
}int main(){signal(2,hand);//1 创建socketserverFd = socket(AF_INET,SOCK_STREAM,0);if(-1 == serverFd) printf("创建socket失败:%m!\n"),exit(-1);printf("创建socket成功!\n");//2 协议地址簇struct sockaddr_in addr={0};addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");//ip地址 注意字符串转网络字节序addr.sin_port = htons(8888);//端口号 用1W左右的  //3 绑定int r = bind(serverFd,(struct sockaddr*)&addr,sizeof addr); if(-1 == r) printf("绑定失败:%m!\n"),close(serverFd),exit(-1);printf("绑定成功!\n");//4 监听r = listen(serverFd,100);//最大容量为100if(-1 == r) printf("监听失败:%m!\n"),close(serverFd),exit(-1);printf("监听成功!\n");//5 接受客户端连接struct sockaddr_in cAddr = {0};//用来接收客户端的协议地址簇int len = sizeof cAddr;clientFd = accept(serverFd,(struct sockaddr*)&cAddr,&len);if(-1 == clientFd) printf("服务器崩溃:%m\n"),close(serverFd),exit(-1);printf("接受客户端连接成功:%d %s %u\n",clientFd,inet_ntoa(cAddr.sin_addr),cAddr.sin_port);//6 通信char buff[1024];int n=0;char temp[1024];while(1){r = recv(clientFd,buff,1023,0);if(r > 0) {buff[r] = '\0';//添加字符串结束符号 '\0'printf("%d:%s\n",r,buff);sprintf(temp,"%d-%s",n++,buff);send(clientFd,temp,strlen(temp),0);}}
}
客户端
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int fd;
void hand(int s){if(2 == s){//5 断开连接close(fd);printf("bye bye !\n");exit(1);}
}int main(){signal(2,hand);//1 创建socketfd = socket(AF_INET,SOCK_STREAM,0);if(-1 == fd) printf("创建socket失败:%m!\n"),exit(-1);printf("创建socket成功!\n");//2 协议地址簇struct sockaddr_in addr={0};addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");//ip地址 注意字符串转网络字节序addr.sin_port = htons(8888);//端口号 用1W左右的  大小端转换//3 连接服务器int r = connect(fd,(struct sockaddr*)&addr,sizeof addr);if(-1 == r) printf("连接服务器失败:%m!\n"),exit(-1);printf("连接服务器成功!\n");//4 通信char buff[1024];char temp[1024];while(1){printf("请输入要发送给服务器的数据:");scanf("%s",buff);r = send(fd,buff,strlen(buff),0);printf("发送%d字节数据到服务器!\n",r);r = recv(fd,temp,1023,0);if(r>0){temp[r] = '\0';printf("服务器回复:%s\n",temp);}}
}

7. 结论

Socket编程是网络通信的基础,通过了解各种Socket API的使用,可以实现复杂的网络应用程序。在实际编程中,掌握错误处理和高级特性如非阻塞I/O和多路复用是非常重要的。

相关文章:

Linux下Socket编程

1. Socket简介 Socket是什么&#xff1f; Socket是一种进程间通信的机制&#xff0c;通过它应用程序可以通过网络进行数据传输。Socket提供了一种跨平台的接口&#xff0c;使得同样的代码可以在不同的操作系统上运行。Socket类型 流式套接字&#xff08;SOCK_STREAM&#xff0…...

Scrapy 爬虫的大模型支持

使用 Scrapy 时&#xff0c;你可以轻松使用大型语言模型 (LLM) 来自动化或增强你的 Web 解析。 有多种使用 LLM 来帮助进行 Web 抓取的方法。在本指南中&#xff0c;我们将在每个页面上调用一个 LLM&#xff0c;从中抽取我们定义的一组属性&#xff0c;而无需编写任何选择器或…...

数据仓库简介(一)

数据仓库概述 1. 什么是数据仓库&#xff1f; 数据仓库&#xff08;Data Warehouse&#xff0c;简称 DW&#xff09;是由 Bill Inmon 于 1990 年提出的一种用于数据分析和挖掘的系统。它的主要目标是通过分析和挖掘数据&#xff0c;为不同层级的决策提供支持&#xff0c;构成…...

Kafka和RabbitMQ区别

RabbitMQ的消息延迟是微秒级&#xff0c;Kafka是毫秒级&#xff08;1毫秒1000微秒&#xff09; 延迟消息是指生产者发送消息发送消息后&#xff0c;不能立刻被消费者消费&#xff0c;需要等待指定的时间后才可以被消费。 Kafka的单机呑吐量是十万级&#xff0c;RabbitMQ是万级…...

go-zero学习

go-zero官网&#xff1a; https://go-zero.dev/docs/tasks 好文&#xff1a; https://blog.csdn.net/m0_63629756/article/details/136599547 视频&#xff1a; https://www.bilibili.com/video/BV18JxUeyECg 微服务基础 根目录下&#xff0c;一个文件夹就是一个微服务。如果微…...

python如何查询函数

1、通用的帮助函数help() 使用help()函数来查看函数的帮助信息。 如&#xff1a; import requests help(requests) 会有类似如下输出&#xff1a; 2、查询函数信息 ★查看模块下的所有函数&#xff1a; dir(module_name) #module_name是要查询的函数名 如&#xff1a; i…...

计算机视觉与深度学习 | 从激光雷达数据中提取地面点和非地面点(附matlab代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 激光雷达数据 使用velodyneFileReader函数从P...

vulnhub-wakanda 1靶机

vulnhub&#xff1a;wakanda: 1 ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.81.5&#xff0c;扫描端口 四个端口&#xff0c;详细扫描一下 似乎没什么值得注意的&#xff0c;先看网站 就这一个页面&#xff0c;点按钮也没反应&#xff0c;扫…...

Bilibili视频如何保存到本地

Bilibili(哔哩哔哩)作为中国领先的视频分享平台之一&#xff0c;汇聚了大量的优质内容&#xff0c;从搞笑动画、综艺节目到专业教程&#xff0c;应有尽有。许多用户时常会遇到这样的需求&#xff1a;希望将视频保存到本地&#xff0c;方便离线观看或者保存珍藏。由于版权保护等…...

C++之多线程

前言 多线程和多进程是并发编程的两个核心概念,它们在现代计算中都非常重要,尤其是在需要处理大量数据、提高程序性能和响应能力的场景中。 多线程的重要性: 资源利用率:多线程可以在单个进程中同时执行多个任务,这可以更有效地利用CPU资源,特别是在多核处理器上。 性…...

《C++音频降噪秘籍:让声音纯净如初》

在音频处理领域&#xff0c;降噪是一项至关重要的任务。无论是录制音乐、语音通话还是音频后期制作&#xff0c;都需要有效地去除背景噪声&#xff0c;以获得清晰、纯净的音频效果。在 C中实现高效的音频降噪处理&#xff0c;可以为音频应用带来更高的质量和更好的用户体验。本…...

C(十)for循环 --- 黑神话情景

前言&#xff1a; "踏过三界宝刹&#xff0c;阅过四洲繁华。笑过五蕴痴缠&#xff0c;舍过六根牵挂。怕什么欲念不休&#xff0c;怕什么浪迹天涯。步履不停&#xff0c;便是得救之法。" 国际惯例&#xff0c;开篇先喝碗鸡汤。 今天&#xff0c;杰哥写的 for 循环相…...

记录一次docker报错无法访问文件夹,权限错误问题

记录一次docker报错无法访问文件夹&#xff0c;权限错误问题 1. 背景 使用docker安装photoview&#xff0c;为其分配了一个cache目录&#xff0c;用户其缓存数据。在运行过程中&#xff0c;扫描文件后显示如下错误 could not make album image cache directory: mkdir /app/c…...

react crash course 2024(8) useEffect

引入 import { useEffect } from react; useEffect – React 中文文档useEffect 是一个 React Hook&#xff0c;它允许你 将组件与外部系统同步。 有些组件需要与网络、某些浏览器 API 或第三方库保持连接&#xff0c;当它们显示在页面上时。这些系统不受 React 控制&#xff0…...

GEE开发之Modis_NDWI数据分析和获取

GEE开发之Modis_NDWI数据分析和获取 0 数据介绍NDWI介绍MOD09GA介绍 1 NDWI天数据下载2 NDWI月数据下载3 NDWI年数据下载 前言&#xff1a;本文主要介绍Modis下的NDWI数据集的获取。归一化差异水指数 (NDWI) 对植被冠层液态水含量的变化很敏感。它来自近红外波段和第二个红外波…...

netty之NettyClient半包粘包处理、编码解码处理、收发数据方式

前言 Netty开发中&#xff0c;客户端与服务端需要保持同样的&#xff1b;半包粘包处理&#xff0c;编码解码处理、收发数据方式&#xff0c;这样才能保证数据通信正常。在前面NettyServer的章节中我们也同样处理了&#xff1b;半包粘包、编码解码等&#xff0c;为此在本章节我们…...

Linux:文件描述符介绍

文章目录速览 1、虚拟地址空间(1)What&#xff08;什么是虚拟地址空间&#xff09;(2)Why&#xff08;为什么需要虚拟地址空间&#xff09; 2、文件描述符(1)What&#xff08;什么是文件描述符&#xff09;(2)文件描述符表 1、虚拟地址空间 (1)What&#xff08;什么是虚拟地址…...

stm32f103调试,程序与定时器同步设置

在调试定时器相关代码时&#xff0c;注意到定时器的中断位总是置1&#xff0c;怀疑代码有问题&#xff0c;经过增大定时器的中断时间&#xff0c;发现定时器与代码调试并不同步&#xff0c;这一点对于调试涉及定时器的代码是非常不利的&#xff0c;这里给出keil调试stm32使定时…...

《Python编程:从入门到实践》数据可视化

一、项目 数据可视化学习 二、库依赖 matplotlib&#xff0c;pygal&#xff0c; 三、生成数据 1.绘制简单的折线图 import matplotlib.pyplot as pltsquares [1, 4, 9, 16, 25] plt.plot(squares) plt.show() 模块pyplot包含很多用于生成图表的函数。 &#xff08;1&am…...

github/git密钥配置与使用

零、前言 因为要在ubuntu上做点东西&#xff0c;发现git clone 的时候必须输账户密码&#xff0c;后来发现密码是token&#xff0c;但是token一大串太烦了&#xff0c;忙了一天发现可以通过配置 公钥 来 替代 http 的 部署方式。 一、生成 ssh 密钥对 我们先测试下能不能 连接…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...