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

自制网络连接工具(支持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或UDP
    int 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.kler.cn/a/321011.html

相关文章:

  • H3C NX30Pro刷机教程-2024-11-16
  • 如何利用WebSockets实现高效的实时通信应用
  • 一文3000字从0到1带你进行Mock测试(建议收藏)
  • web安全漏洞之ssrf入门
  • Python 中常用的格式符号
  • 【从零开始的LeetCode-算法】3270. 求出数字答案
  • SDK(1.1note)
  • Qt/C++事件过滤器与控件响应重写的使用、场景的不同
  • 【ollama 在linux 上离线部署 本地大模型】
  • vue-animate-onscroll动画库(可来回触发动画)
  • Latex和Vscode安装和配置
  • 【Python】pip安装加速:使用国内镜像源
  • 华为---代理ARP简介及示例配置
  • 深度学习模型之BERT的24个小模型源码与预训练紧凑模型的重要性
  • c# 自定义字符串排序
  • Vue引入js脚本问题记录(附解决办法)
  • CAD 3dsmax maya等autodesk系列专用卸载修复工具AutoRemove,一键完全彻底卸载删除软件的专用卸载工具
  • jmeter性能测试---csv数据文件设置
  • Linux下线程间的通信
  • 11. Map和Set
  • java mybaits oracle插入返回主键
  • 9.26作业
  • Python中的文件编码:揭开字符世界的神秘面纱
  • 【HTTPS】—— HTTPS协议原理详解
  • 基于web的生产信息管理系统的设计与实现
  • netty编程之基于websocket发送二进制数据