【Socket】Unix环境下搭建局域网内TCP服务端

news/2025/3/15 12:28:40/

本文搭建一个简单的、Unix环境下的、局域网内的TCP服务端:每当有客户端连接时,打印一下对方的ip地址及端口号。

本文要学习的Unix网络IPC的套接字函数:

  1. socket
  2. bind
  3. listen
  4. accept

本文要学习的一些工具函数:

  1. inet_pton
  2. htons
  3. getsockname
  4. getpeername

本文涉及到的要点:

  1. 地址族
  2. 套接字类型
  3. 协议族
  4. 地址格式
  5. 字节序 

示例代码:

#include <iostream>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>int main(int argc, char** argv) {std::string ip{"192.168.0.110"};    // 网络序: 6e00a8c0// 第3个参数可填0,自动选择协议int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in addr{.sin_family = AF_INET,.sin_port = htons(10010)    // 十六进制: 0x271A};if (inet_pton(AF_INET, ip.c_str(), &addr.sin_addr) <= 0) {_exit(0);}int success = bind(server, reinterpret_cast<const sockaddr*>(&addr), sizeof(sockaddr_in));socklen_t len = sizeof(sockaddr);sockaddr any;// 利用server自己的fd,读取当前server的信息success = getsockname(server, &any, &len);if (success == 0){std::cout << (int)any.sa_len << std::endl;      // 同 lenstd::cout << (int)any.sa_family << std::endl;   // 协议族的值if (any.sa_family == AF_INET) {sockaddr_in* ipv4 = reinterpret_cast<sockaddr_in*>(&any);std::cout << ipv4->sin_port << std::endl;   // 6695, 此处为网络字节序std::cout << std::hex << ipv4->sin_addr.s_addr << std::endl;    // 6e00a8c0, 此处为网络字节序std::cout << std::dec;}}success = listen(server, 50);while (true){sockaddr client_addr;socklen_t len = sizeof(sockaddr);int conn = accept(server, &client_addr, &len);// 读取连接建立时server的信息success = getsockname(conn, &any, &len);if (success == 0){std::cout << (int)any.sa_len << std::endl;      // 同 lenstd::cout << (int)any.sa_family << std::endl;   // 协议族的值if (any.sa_family == AF_INET) {sockaddr_in* ipv4 = reinterpret_cast<sockaddr_in*>(&any);std::cout << ipv4->sin_port << std::endl;   // 6695, 此处为网络字节序std::cout << std::hex << ipv4->sin_addr.s_addr << std::endl;    // 6e00a8c0, 此处为网络字节序std::cout << std::dec;}}// 读取连接建立时client的信息success = getpeername(conn, &any, &len);if (success == 0) {if (any.sa_family == AF_INET) {sockaddr_in* ipv4 = reinterpret_cast<sockaddr_in*>(&any);std::cout << ipv4->sin_port << std::endl;std::cout << std::hex << ipv4->sin_addr.s_addr << std::endl;std::cout << std::dec;}}}close(server);return 0;
}

 


http://www.ppmy.cn/news/1255962.html

相关文章

如何开启Windows Server 2016 远端桌面

使用GUI 设定 服务器管理器–> 本地服务器–> 远端桌面 启用远端桌面 远端–> 允许远端连线至此电脑 会提示防火墙设定跟电源设定 防火墙之前已经关闭了 完成

计算UDP报文CRC校验的总结

概述 因公司项目需求&#xff0c;遇到需要发送带UDP/IP头数据包的功能&#xff0c;经过多次尝试顺利完成&#xff0c;博文记录以备忘。 环境信息 操作系统 ARM64平台的中标麒麟Kylin V10 工具 tcpdump、wireshark、vscode 原理 请查看大佬的博文 UDP伪包头定义&#x…

如何在Ubuntu上安装pip3

一、检查系统是否安装pip3 首先&#xff0c;我们需要检查系统中是否已经安装了pip3。为此&#xff0c;我们可以运行以下命令&#xff1a; pip3 --version如果系统已经安装了pip3&#xff0c;您将会看到输出结果类似于&#xff1a; pip 19.0.3 from /usr/local/lib/python3.6…

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL&#xff08;数字用户线&#xff09;6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

【Geoserver】SLD点位样式(PointSymbolizer)设计全通

SLD文件可以控制geoserver的样式管理&#xff0c;这里专门针对点位进行设计&#xff0c;首先点位的设计需要用到这面这个大标签 之前的项目中已经用到了很多关于面的样式管理&#xff0c;这里新学习的是关于点的样式管理 PointSymbolizer 参考资料地址&#xff1a;https://doc…

LabVIEW远程监控

LabVIEW远程监控 远程监控的应用场景 从办公室远程监控工厂车间的测试设备。 在世界另一端的偏远地区监控客户现场的发电设备。 从公司远程监控外场的产品。 技术更新与方法 自2018年以来&#xff0c;NI对基于Web的应用程序支持大幅增长。一些最初的方法&#xff08;如Lab…

基于 ESP32 的带触摸显示屏的 RFID 读取器

如何设计一款基于 ESP32 且具有 ILI9341 触摸屏显示屏且适合壁挂式安装的美观 RFID 读取器。 本项目中用到的东西 硬件组件 ESP32 开发套件 C 1 AZ-Touch ESP 套件 1 RFID-RC522 IC卡读写器 1 ​编辑 电线、绕包线 1 详细设计流程 …

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数&#xff0c;是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c;这⾥的数组名表⽰整个数组&…