首页 > 其他分享 >C语言实现 网络通信 Network

C语言实现 网络通信 Network

时间:2024-10-21 08:52:16浏览次数:8  
标签:网络通信 return addr sock C语言 Network fd nw

在现代计算机网络中,网络通信是不可或缺的一部分。本文将介绍如何使用C语言实现一个简单的网络通信库,涵盖TCP和UDP协议的基本功能。我们将通过一个示例代码库进行详细讲解,以便更好地理解网络编程的核心概念。

项目结构

本项目包含两个文件:

  • network.h:头文件,定义了数据结构和函数原型。
  • network.c:实现文件,包含具体的网络通信功能。

1. 关键结构体

network.h中,我们定义了一个Network结构体,包含以下字段:

typedef struct Network
{
    int type;  // 通信协议类型
    int sock_fd; // socket描述符
    struct sockaddr_in addr; // 通信地址
    socklen_t addrlen; // 通信地址字节数
    bool issvr; // 是否是服务器
} Network;

2. 初始化网络

init_nw函数是这个网络库的核心,用于创建socket并初始化地址。根据传入的参数(是否为服务器,协议类型等),该函数执行不同的初始化操作。

Network *init_nw(int type, short port, const char *ip, bool issvr)
{
    Network *nw = malloc(sizeof(Network));
    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->type = type;
    nw->issvr = issvr;
    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)) {
            free(nw);
            perror("bind");
            return NULL;
        }
        if (SOCK_STREAM == type && listen(nw->sock_fd, 50)) {
            free(nw);
            perror("listen");
            return NULL;
        }
    } else if (SOCK_STREAM == type) { // TCP客户端
        if (connect(nw->sock_fd, (SP)&nw->addr, nw->addrlen)) {
            free(nw);
            return NULL;
        }
    }

    return nw;
}

3. 等待连接

accept_nw函数用于TCP服务器端,等待客户端的连接请求。它检查当前Network对象是否为服务器类型,并返回新的连接对象。

Network *accept_nw(Network* svr_nw)
{
    if (SOCK_STREAM != svr_nw->type || !svr_nw->issvr) {
        printf("只有tcp协议的服务器端的NETWORK对象可以使用");
        return NULL;
    }

    Network *nw = malloc(sizeof(Network));
    nw->addrlen = svr_nw->addrlen;
    nw->type = SOCK_STREAM;
    nw->issvr = true;
    nw->sock_fd = accept(svr_nw->sock_fd, (SP)&nw->addr, &nw->addrlen);

    if (nw->sock_fd < 0) {
        free(nw);
        perror("accept");
        return NULL;
    }

    return nw;
}

4. 发送与接收数据

send_nwrecv_nw函数分别用于发送和接收数据。根据协议类型,这两个函数会采用不同的方法处理数据。

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);
    }
}

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);
    }
}

5. 关闭连接

close_nw函数用于关闭socket并释放内存,确保资源得到有效管理。

void close_nw(Network *nw)
{
    close(nw->sock_fd);
    free(nw);
}

6. 获取IP地址

getip_nw函数用于获取并返回与网络对象关联的IP地址。

const char *getip_nw(Network *nw)
{
    return inet_ntoa(nw->addr.sin_addr);
}

总结

通过这种模块化的设计,我们实现了一个简单而强大的网络通信库,易于扩展和维护。用户只需调用高层函数即可实现复杂的网络通信,极大提高了开发效率。这种封装和结构化的写法不仅使代码更易于阅读和理解,还能有效避免常见的错误。希望本文能够为你的网络编程实践提供帮助和启发!

4o

标签:网络通信,return,addr,sock,C语言,Network,fd,nw
From: https://blog.csdn.net/qq_50394172/article/details/143103373

相关文章

  • 【趣学C语言和数据结构100例】
    【趣学C语言和数据结构100例】问题描述51.在一个递增有序的单链表中,存在重复的元素。设计算法删除重复的元素,例如(7.10.10.21.30.42.42.42.51.70)将变为(7.10.21.30.42.51.70)。52.设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中的公共元素产......
  • c语言:指针以及指针变量(一)
    目录地址有关地址的操作符取地址操作符&解引用操作符*指针变量指针的传参调用指针+-整数void*指针指针-指针野指针野指针成因指针未初始化指针越界访问指针指向的空间被释放防止出现野指针地址地址也就是我们常说的指针,在讲解指针前先讲个生活中的小例子,方便理......
  • C语言深入理解指针笔记(3)
    1.字符指针变量 我们已经了解的指针变量类型有:整形指针变量:int*pint:存放的是整型变量的地址浮点型指针变量:float*pf:存放的是浮点型变量的地址类比可知:char*pc:字符型指针变量:存放的是字符型变量的地址,指向字符型的数据 首先,字符型指针变量的使用有两种方法:......
  • C语言笔记21 字符串
    字符数组charword[]={'H','e','l','l','o','!'};word[0]Hword[1]eword[2]lword[3]lword[4]oword[5]!这不是C语言的字符串,只是字符数组,不能用字符串的方式做计算字符串charword[]={'H','e','l','l&......
  • [包教包会]C语言:详解分支语句(if , switch , goto)和循环语句(while , for , do while
    概览控制语句用于控制程序的执行流程,以实现程序的各种结构方式C语言支持三种结构:顺序结构、选择结构(分支)、循环结构:(其实显示中的事件也都是由这三者混合合成的)它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:1.条件判断语句也叫分支语句:if语句......
  • 【C语言】指针进阶【万字详细版】
    ㊙️小明博客主页:➡️敲键盘的小明㊙️✅关注小明了解更多知识☝️文章目录前言一、字符指针二、指针数组三、数组指针3.1数组指针的定义3.2数组名和&数组名3.3数组指针的使用四、数组参数、指针参数4.1—维数组传参4.2二维数组传参4.3一级指针传参4.4二级指针......
  • C语言库函数round函数
    简单使用:把浮点数四舍五入到整数round函数定义在<math.h>头文件中,其原型为doubleround(doublex);round函数用于将浮点数四舍五入到最接近的整数以下的C语言代码用round函数计算了不同浮点数的四舍五入值,并将结果打印出来#include<stdio.h>#include<math.h>intmai......
  • C语言练习之猜数字游戏
    一游戏规则:1.在电脑上生成1-100的随机数2.玩家可以输入所猜数字,电脑根据输入数字做出猜大、猜小、猜对的反馈二游戏的实现:1.随机数的生成:1.1rand C语言的库函数提供了一个rand函数,它的头文件是stdlib.h,rand函数可以根据一个种子随机生成0-RAND_MAX(最少是32767)......
  • C语言小白 记录自己对一些概念的理解 若有错误 多包涵 若能指正 万分感激
    当你想将输入和判断输入一起做时可以用while((数组名[i]=getchar())!='\n')记得拿括号括起来辅助在写!=CG平台使用输入重定向输入测试数据,需要使用(ch=getchar())!=EOF判断字符串输入结束,如果使用(ch=getchar())!='\n'上传到CG平台后可能会超时。写oj的时候如......
  • C语言中的段错误(Segmentation Fault):底层原理及解决方法
    引言在C语言编程中,“段错误”(通常由操作系统信号SIGSEGV触发)是一种常见的异常情况,它表明程序试图访问不受保护的内存区域。本文将深入探讨段错误的原因、底层原理、常见情况以及如何调试和解决这类错误。段错误的定义段错误是一种运行时错误,通常由以下几种情况触发:访......