您的位置:首页 > 汽车 > 时评 > 网页设计制作网站成品_吉林网络公司哪家好_怎么开网店_开淘宝店铺怎么运营推广

网页设计制作网站成品_吉林网络公司哪家好_怎么开网店_开淘宝店铺怎么运营推广

2025/1/6 17:08:50 来源:https://blog.csdn.net/m0_57538342/article/details/142388027  浏览:    关键词:网页设计制作网站成品_吉林网络公司哪家好_怎么开网店_开淘宝店铺怎么运营推广
网页设计制作网站成品_吉林网络公司哪家好_怎么开网店_开淘宝店铺怎么运营推广

自制网络连接工具(支持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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com