学习Linux网络编程基本函数

学习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日

相关文章

  • Python ORM数据库框架Sqlalchemy的使用教程详解

    Python ORM数据库框架Sqlalchemy的使用教程详解 Sqlalchemy是一个强大的Python ORM(对象关系映射)库,它提供了灵活且易于使用的方式来操作数据库。以下是Sqlalchemy的使用教程: 安装Sqlalchemy库: python pip install sqlalchemy 导入Sqlalchemy库: python imp…

    other 2023年10月18日
    00
  • Win11电脑Explorer.exe进程占用内存高怎么办 ?Explorer.exe占用内存高解决方法

    下面是详细的攻略: Win11电脑Explorer.exe进程占用内存高问题 在 Windows 11 中,Explorer.exe 是操作系统的主要组件之一,常常因为一些原因导致其占用的内存变高,使系统运行变得缓慢。本文将介绍一些解决方法来降低 Explorer.exe 进程的内存占用,让系统可以运行得更快。 排查程序 首先,我们需要确认高内存占用是由 E…

    other 2023年6月25日
    00
  • 浅谈Java父子类加载顺序

    浅谈Java父子类加载顺序 在Java中,每个类都需要被加载才能被使用。这个过程中,父类和子类的加载顺序会对最终的运行结果产生影响。下面我们来详细讲解Java父子类加载顺序的完整攻略。 1. Java类加载机制 Java类加载器按照从上往下、从父到子的顺序,依次进行类加载: 引导类加载器:JVM自带的类加载器,主要用来加载Java核心库,比如rt.jar等。…

    other 2023年6月26日
    00
  • 详解Linux环境变量配置全攻略

    详解Linux环境变量配置全攻略 本文将详细讲解如何在Linux系统中配置环境变量。环境变量是指一些特定的变量,用于指示系统或应用程序在执行时需要使用什么样的参数、文件路径、库路径等信息。在Linux中配置环境变量可以方便我们的日常开发和操作。 1. 环境变量的基本概念 1.1 什么是环境变量 环境变量是一些系统级别的参数或变量,用于控制Linux系统中的行…

    other 2023年6月27日
    00
  • 【转】wpf自定义控件与样式(4)-checkbox/radiobutton自定…

    【转】WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式 摘要 本文主要介绍如何在WPF中自定义CheckBox和RadioButton的样式,以及对样式的详细解释。通过本文的学习,读者可以了解到如何在WPF应用程序中创建自己的CheckBox和RadioButton控件,并将它们应用于自己的实际开发项目中。 介绍 WPF是一个…

    其他 2023年3月28日
    00
  • Android获取与设置系统环境变量的方法指南

    Android获取与设置系统环境变量的方法指南 一、什么是系统环境变量 系统环境变量指的是在计算机操作系统中,为了方便用户使用和管理系统软件而定义的一些参数。可以理解为是一些键值对,其中键为变量名,值为变量值,这些变量可以在计算机的任何地方调用。 二、系统环境变量的作用 系统环境变量有着广泛的应用,如: JDK、SDK等程序的安装目录 系统临时文件夹路径 M…

    other 2023年6月27日
    00
  • c++共享内存

    在C++中,共享内存是一种进程间通信的方式,它允许多个进程共享同一块内存区域。本文将介绍如何在C++中使用共享内存,并提供两个示例说明。 步骤一:创建共享内存 以下是一个示例,演示如何创建共享内存: #include <iostream> #include <sys/ipc.h> #include <sys/shm.h> …

    other 2023年5月9日
    00
  • win10 eclipse配置环境变量的教程图解

    下面就是针对“win10 eclipse配置环境变量的教程图解”的完整攻略。 环境变量的作用 环境变量是在操作系统中用来设置系统级参数和用户级参数的一种方法。在Windows操作系统中,每个环境变量都对应一个值,通过设置环境变量来在系统中使用某些程序、工具或库。 在配置Eclipse开发环境时,配置JAVA_HOME和Path两个系统级环境变量是必不可少的。…

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