学习Linux网络编程基本函数

yizhihongxing

学习Linux网络编程基本函数

概述

学习 Linux 网络编程基本函数是使用 Linux 操作系统进行网络编程的前提和基础。在编写网络应用程序时,需要使用 Linux 网络编程基本函数来完成各种网络通信操作。本攻略将详细介绍 Linux 网络编程基本函数的使用方法。

网络编程基本函数

Linux 网络编程基本函数主要包括以下几个部分:

socket()

在 Linux 网络编程中,socket() 函数用于创建一个新的套接字并返回套接字描述符。套接字描述符是进程操作套接字的接口。下面是一个简单的示例:

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

参数说明:

  • domain:协议类型
  • type:套接字类型
  • protocol:协议编号

bind()

bind() 函数用于将套接字描述符与一个 IP 地址和端口号关联。下面是一个简单的示例:

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数说明:

  • sockfd:套接字描述符
  • addr:IP 地址和端口号
  • addrlen:IP 地址和端口号的长度

listen()

listen() 函数用于将套接字描述符设置为监听状态,等待客户端的连接请求。下面是一个简单的示例:

#include <sys/socket.h>
int listen(int sockfd, int backlog);

参数说明:

  • sockfd:套接字描述符
  • backlog:等待连接队列的最大长度

accept()

accept() 函数用于接受客户端的连接请求,并创建一个新的套接字描述符来处理该连接。下面是一个简单的示例:

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

  • sockfd:套接字描述符
  • addr:客户端的 IP 地址和端口号
  • addrlen:客户端的 IP 地址和端口号的长度

示例

下面是一个简单的网络编程示例:在客户端和服务器端之间传递一个字符串。服务器端创建一个套接字并等待客户端的连接请求。客户端连接服务器,并向服务器发送一条消息。服务器接收到消息后将其打印出来。

服务器端代码(server.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 9000

int main() {
    int sockfd, newsockfd;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Failed to create socket");
        exit(EXIT_FAILURE);
    }

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(PORT);

    if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("Failed to bind socket");
        exit(EXIT_FAILURE);
    }

    listen(sockfd, 5);

    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);

    if (newsockfd < 0) {
        perror("Failed to accept connection");
        exit(EXIT_FAILURE);
    }

    memset(buffer, 0, sizeof(buffer));
    n = read(newsockfd, buffer, sizeof(buffer));
    if (n < 0) {
        perror("Failed to read from socket");
        exit(EXIT_FAILURE);
    }

    printf("Message received: %s\n", buffer);

    close(sockfd);
    close(newsockfd);

    return 0;
}

客户端代码(client.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 9000

int main() {
    int sockfd;
    struct sockaddr_in serv_addr;
    char buffer[256] = "Hello, server!";
    int n;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Failed to create socket");
        exit(EXIT_FAILURE);
    }

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        perror("Invalid address/ Address not supported");
        exit(EXIT_FAILURE);
    }

    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("Failed to connect to server");
        exit(EXIT_FAILURE);
    }

    n = write(sockfd, buffer, strlen(buffer));
    if (n < 0) {
        perror("Failed to write to socket");
        exit(EXIT_FAILURE);
    }

    close(sockfd);

    return 0;
}

编译并执行结果:

$ gcc -o server server.c
$ ./server
# 在另一个终端窗口中
$ gcc -o client client.c
$ ./client

结果:

# 服务器端输出
$ ./server
Message received: Hello, server!

以上就是一个简单的 TCP 网络编程示例。通过该示例,我们可以了解到 Linux 网络编程基本函数的使用方法及其原理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习Linux网络编程基本函数 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C语言 推理证明带环链表详细过程

    C语言 推理证明带环链表详细过程 背景 链表是一种常见的数据结构。通常,链表节点包括两个部分:数据域和指针域。指针域指向下一个节点的地址,这样就可以将链表的节点串联起来。带环链表是一种特殊的链表,最后一个节点指向链表中第一个节点,形成一个环。 问题 如果一个链表是带环链表,如何判断链表中是否存在环? 分析 假设链表的节点数是N,我们可以定义两个指针,一个指针…

    other 2023年6月27日
    00
  • python3对数据库的基本操作

    Python3对数据库的基本操作 Python3提供了许多库来连接和操作各种类型的数据库。在本文中,我们将介绍Python3中对数据库的基本操作,包括连接数据库、创建表、插入数据查询数据、更新数据删除数据。 连接数据库 在Python3中,我们可以使用不同的库来连接不同类型的数据库。以下是一些常用的库: MySQL:-connector-python Pos…

    other 2023年5月9日
    00
  • bat命令批处理判断32位还是64位系统的多种方法

    当使用批处理脚本编写时,可以使用多种方法来判断操作系统是32位还是64位。下面是一些常用的方法: 方法一:使用%PROCESSOR_ARCHITECTURE%环境变量 在Windows操作系统中,可以使用%PROCESSOR_ARCHITECTURE%环境变量来判断系统的位数。该环境变量的值为x86表示32位系统,值为AMD64表示64位系统。 以下是一个示…

    other 2023年7月28日
    00
  • python实现合并两个排序的链表

    下面是“python实现合并两个排序的链表”的完整攻略: 1. 题目描述 给定两个排好序的链表,将这两个链表合并成一个新的链表并返回。 例如,输入链表1为 1->2->4,链表2为 1->3->4,则合并后的新链表为 1->1->2->3->4->4。 2. 思路 定义新链表的头结点; 定义一个游标,指向…

    other 2023年6月28日
    00
  • R语言画正弦曲线

    R语言画正弦曲线 在R语言中,我们可以很方便地使用plot函数绘制正弦曲线。 准备数据 首先,我们需要准备数据。在这里,我们可以通过seq函数生成从0到2π的等间隔数字序列,然后再通过sin函数计算每个数字序列的正弦值。代码如下: x <- seq(0, 2 * pi, length.out = 100) y <- sin(x) 绘制图形 接下来…

    其他 2023年3月28日
    00
  • Asp.Net Core基础篇之:白话管道中间件

    Asp.Net Core基础篇之:白话管道中间件 在 Asp.Net Core 中,管道(Pipeline)是请求处理过程中的重要概念,是一组按顺序执行的中间件(Middleware)组成。本篇文章将详细讲解 Asp.Net Core 中的管道中间件。 什么是中间件? 在 Asp.Net Core 中,中间件是请求和响应模型的抽象。中间件是在管道中按顺序执行…

    其他 2023年3月28日
    00
  • Maven是什么?Maven的概念+作用+仓库的介绍+常用命令的详解

    Maven是什么? Maven是一个强大的项目管理工具,利用Maven,我们可以更加轻松地构建、管理和发布Java项目。Maven的核心是一个可以自动化构建基于XML格式的项目定义文件(pom.xml),并自动处理项目依赖关系的构建系统。Maven也提供了许多标准构建任务,例如编译、测试和打包项目等。 Maven的概念: Maven的核心框架由一个中央仓库、…

    other 2023年6月27日
    00
  • 微信JSSDK实现打开摄像头拍照再将相片保存到服务器

    实现微信JSSDK打开摄像头拍照再将照片保存到服务器,主要包括以下几个步骤: 1.在微信公众平台中申请AppID,并开通JSSDK功能。 2.在网页中引入微信JSSDK,并使用微信提供的API调用摄像头功能。 3.将摄像头拍摄的照片进行编码并上传到服务器。 以下是具体的实现攻略: 一、申请AppID和开通JSSDK 首先需要在微信公众平台申请一个AppID,…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部