自制网络连接工具(支持tcpudp,客户端服务端)

自制网络连接工具(支持tcp/udp,客户端/服务端)

在这里插入图片描述

将网络连接工具制作成共享库

network.h

#ifndef NETWORK_H
#define NETWORK_H#include<netinet/in.h>
#include<sys/socket.h>
#include<stdbool.h>
typedef struct Network
{int type;//网络类型,TCP或UDPint sock_fd;//socket文件描述符struct sockaddr_in addr;//地址结构体socklen_t addrlen;//地址长度bool issvr;//是否是服务端
}Network;typedef struct sockaddr* SP;
//分配内存,创建套接字,初始化地址,绑定,监听,连接
Network* init_nw(int type,short port,const char* ip,bool issvr);
//等待连接,只有TCP的服务端才能调用
Network* accept_nw(Network* svr_nw);
//具备send和sendto的功能,可以发送数据
int send_nw(Network* nw,void* buf,size_t len);
//具备recv和recvfrom的功能,可以接收数据
int recv_nw(Network* nw,void* buf,size_t len);
//具备close的功能,并且释放资源
void close_nw(Network* nw);//获取ip地址
char* get_ip(Network* nw);
#endif //NETWORK_H

对函数具体实现:

network.c

#include "network.h"
#include <stdio.h>
#include <stdlib.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>//分配内存,创建套接字,初始化地址,绑定,监听,连接
Network* init_nw(int type,short port,const char* ip,bool issvr)
{Network* nw = (Network*)malloc(sizeof(Network));if(nw == NULL){return NULL;}nw->type=type;nw->issvr=issvr;nw->sock_fd=socket(AF_INET,type,0);if(nw->sock_fd <0){free(nw);perror("socket");return NULL;}//初始化地址结构体bzero(&nw->addr,nw->addrlen);//初始化地址nw->addr.sin_family=AF_INET;nw->addr.sin_port=htons(port);nw->addr.sin_addr.s_addr=inet_addr(ip);nw->addrlen=sizeof(struct sockaddr_in);if(issvr){//绑定地址if(bind(nw->sock_fd,(SP)&nw->addr,nw->addrlen)<0){free(nw);perror("bind");return NULL;}//TCP的服务端监听if(nw->type==SOCK_STREAM && listen(nw->sock_fd,50)){free(nw);perror("listen");return NULL;}}else if(SOCK_STREAM == nw->type){if(connect(nw->sock_fd,(SP)&nw->addr,nw->addrlen)){free(nw);perror("connect");return NULL;}}return nw;
}
//等待连接,只有TCP的服务端才能调用
Network* accept_nw(Network* svr_nw)
{if(SOCK_STREAM != svr_nw->type||!(svr_nw->issvr)){printf("只有TCP协议的服务器端才能调用accept_nw\n");return NULL;}//为新的Network分配内存Network* clt_nw = (Network*)malloc(sizeof(Network));if(clt_nw == NULL){return NULL;}clt_nw->addrlen=svr_nw->addrlen;clt_nw->type=svr_nw->type;clt_nw->issvr=true;clt_nw->sock_fd=accept(svr_nw->sock_fd,(SP)&clt_nw->addr,&clt_nw->addrlen);if(clt_nw->sock_fd <0){free(clt_nw);perror("accept");return NULL;}return clt_nw;
}
//具备send和sendto的功能,可以发送数据
int send_nw(Network* nw,void* buf,size_t len)
{if(nw->type == SOCK_DGRAM){return sendto(nw->sock_fd,buf,len,0,(SP)&nw->addr,nw->addrlen);}else{return send(nw->sock_fd,buf,len,0);}
}
//具备recv和recvfrom的功能,可以接收数据
int recv_nw(Network* nw,void* buf,size_t len)
{if(nw->type == SOCK_DGRAM){return recvfrom(nw->sock_fd,buf,len,0,(SP)&nw->addr,&nw->addrlen);}else{return recv(nw->sock_fd,buf,len,0); }
}
//具备close的功能,并且释放资源
void close_nw(Network* nw)
{close(nw->sock_fd);free(nw);
}//获取ip地址
const char* get_ip(Network* nw)
{return inet_ntoa(nw->addr.sin_addr);
}

将代码部分完成后,对其进行封装

封装TCP\UDP通用通信代码库:
1、gcc -fpic -c network.c
2、gcc -shared -fpic network.o -o libnetwork.so
3、sudo cp libnetwork.so /usr/lib
4、sudo cp network.h /usr/include/

使用 gcc code.c -lnetwork

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

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

相关文章

JAVA基础:包装类,BigInteger , BigDecimal

1 包装类 java是一种面向对象的编程语言 对象都是由类产生的。 8种基本类型对java面向对象的特性有所破坏 jdk就提供了8种基本类型所对应的类的表示&#xff0c;称为&#xff1a;包装类 理论上来讲&#xff1a;类属性使用包装类定义&#xff0c;方法中的局部变量使用基本类型…

javamail发邮件:配置SMTP发送邮件的步骤?

javamail发邮件的教程指南&#xff1f;怎么用JavaMail发送邮件&#xff1f; JavaMail API 是 Java 平台上用于发送和接收电子邮件的标准 API&#xff0c;它提供了一套丰富的类和方法&#xff0c;使得开发者能够轻松地实现邮件发送功能。AokSend将详细介绍如何使用 JavaMail AP…

基于atlas环境下YOLOV7的睡岗识别

做到这里&#xff0c;其实只是想探索下新的检测框架、探索下atlas下ACL的推理方式。整个过程持续了3-4周把&#xff0c;回顾一下&#xff0c;感觉还是需要一些技巧才能拿下&#xff0c;如果没有任何经验的是断难搞定此代码的。主要基于华为的官方例子&#xff0c;里面修改了原始…

峟思科普:溢流坝是什么?溢流坝承载着哪些作用

水坝系统中的一项关键组成部分——溢洪结构&#xff0c;又常被称作溢洪道&#xff0c;其独特功能在于精准调控水库水位&#xff0c;确保水坝安全。当水库蓄水量超过预设阈值&#xff0c;该结构能够引导多余水流平稳穿越坝体&#xff0c;注入下游河床。此过程中&#xff0c;坝前…

Snapchat API 访问:Objective-C 实现示例

Snapchat 是一个流行的社交媒体平台&#xff0c;它允许用户发送和接收短暂存在的图片和视频。对于开发者来说&#xff0c;访问 Snapchat API 可以为应用程序添加独特的社交功能。本文将介绍如何在 Objective-C 中实现对 Snapchat API 的访问&#xff0c;并提供一个详细的代码示…

uni-app页面调用接口和路由(四)

文章目录 一、路由二、页面调用接口二、路由跳转1.uni.navigateTo(OBJECT)2.uni.redirectTo(OBJECT)3.uni.reLaunch(OBJECT)4.uni.switchTab(OBJECT)5.uni.navigateBack(OBJECT) 总结 一、路由 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配…

yolo自动化项目实例解析(四)ui页面整理1 (1.85)

我们在上一章整理main.py 的if __name__ __main__: 内容还留下面这一段&#xff0c; from PyQt5.QtWidgets import *from lanrenauto.moni.moni import *from PyQt5.QtGui import *app QApplication(sys.argv) # 初始化Qt应用ratio screen_width / 2560 # 分辨率比例# 设…

centos 安装VNC,实现远程连接

centos 安装VNC&#xff0c;实现远程连接 VNC(Virtual Network Computing)是一种远程控制软件&#xff0c;可以实现通过网络远程连接计算机的图形界面。 服务器安装VNC服务 yum install -y tigervnc-server*启动VNC服务&#xff0c;过程中需要输入连接密码 vncserver :1查看…

全国网安众测招募计划启动啦,欢迎加入~

在数字化时代&#xff0c;网络安全已成为维护社会稳定、促进经济发展的基石。为了积极响应国家关于加强网络安全工作的号召&#xff0c;确保某区域关键信息系统的稳固运行&#xff0c;我们特此启动一项网络安全众测活动。该活动旨在通过汇聚业界有经验的网络安全攻防人才&#…

RetrievalAttention——提高 LLM 处理长上下文的效率

概述 论文地址&#xff1a;https://arxiv.org/abs/2409.10516 本文的研究背景主要是为了解决 "具有长语境的大型语言模型&#xff08;LLM&#xff09;"问题。基于变换器的 LLM 被广泛应用于各个领域&#xff0c;但在处理长上下文时&#xff0c;其计算成本非常高。特…

电脑USB端口禁止软件有哪些?什么软件能指定USB端口禁用?分享四款好用软件!

想象一下&#xff0c;你正准备在办公桌上插入U盘&#xff0c;打算快速拷贝文件&#xff0c;突然系统蹦出一个警告&#xff1a;“这个USB端口已被禁用&#xff01;” 是不是感觉好像被一双隐形的手制止了&#xff1f; 其实&#xff0c;这双“隐形的手”就是专门为企业安全设计…

visionpro脚本

visionproToolBlock的脚本的优先级优于工具连线的优先级&#xff0c;一般是照着脚本的执行顺序进行执行对应的工具&#xff0c;最常用的是C#的高级脚本&#xff0c;C#的脚本如下分为5部分。 第一部分&#xff1a;主要是一些库的引用&#xff0c;对于有些类型不知道库的时候&…

vue2中字符串动态拼接字段给到接口

【设计初衷是用户可根据给定的字段进行准确描述】 实现功能&#xff1a; 1. 文本域内容串动态配置字段&#xff0c;以$ {英文}拼接格式给到接口。 &#xff08;传参如&#xff1a;$ {heat_status_code}正常&#xff0c;$ {wdy_temp}也正常&#xff01;&#xff09; 2. 编辑时根…

Instagram全面升级“青少年账号”保护措施,除了信息分类过滤,还应从根源加强内容审核

在持续多年的监管和诉讼压力下&#xff0c;作为社交网站的巨头&#xff0c;Instagram落实了“最严格的青少年用户保护法”。 Instagram 上所有未满 18 岁的用户都将被归为“青少年用户”&#xff0c;默认把账号设置为私密状态&#xff0c;自动实施多项防护措施&#xff0c;很多…

Vue3实战:使用 errorHandler 捕获全局错误

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在 Vue3 中&#xff0c;app.config.errorHandler 是一个错误处理器&#xff0c;用于为应用内抛出的未捕获错误指定一个全局处理函数&#xff0c;它接收三个参数&#xff1a;错误对象、触发该错误的组件…

什么品牌超声波清洗机质量好?四大绝佳超声波清洗机品牌推荐!

在快节奏的现代生活中&#xff0c;个人物品的清洁卫生显得至关重要。眼镜、珠宝饰品、手表乃至日常餐厨用具&#xff0c;这些频繁接触的物品极易累积污渍与细菌。拿眼镜为例&#xff0c;缺乏定期清洁会让油渍与尘埃积累&#xff0c;进而成为细菌的温床&#xff0c;靠近眼睛使用…

人脸识别系统+电插锁安装配置过程

一、适用场景 1、各住宅小区内&#xff0c;一个单元涉及多户&#xff0c;一楼安装公共的人脸识别门禁进行身份的认证。 2、某企业的职工住宅区&#xff0c;企业统一安装人脸识别门禁认证身份。 3、自建楼栋&#xff0c;分多间出租给住户时&#xff0c;每个住户配备电子钥匙存在…

GEE使用require函数调用自己的Js库

新建了一个repository&#xff0c;名为Lib 把我的地形校正的函数放了进去 在自己的代码中调用就用到这个路径&#xff0c;主要Lib后面用冒号

观《中国数据库前世今生》有感:从历史到未来的技术变迁

观《中国数据库前世今生》有感&#xff1a;从历史到未来的技术变迁 在数字化浪潮中&#xff0c;数据库技术作为信息化建设的核心&#xff0c;承载了时代发展的脉搏。观看了纪录片《中国数据库前世今生》后&#xff0c;我深深感受到了中国数据库技术从无到有、从追赶到引领的艰…

深度残差网络ResNet简介

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 《PyTorch深度学习与企业级项目实战&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;宋立林)【摘要 书评 试读】- 京东图书 (jd.com) 卷积神经网络经典模型架构简介-CSDN博客 深度残差网络&#xf…