huanayun
hengtianyun
vps567
莱卡云

[Linux操作系统]Socket编程入门教程——从基础到实践|socket编程菜鸟教程,Socket编程入门教程

PikPak

推荐阅读:

[AI-人工智能]免翻墙的AI利器:樱桃茶·智域GPT,让你轻松使用ChatGPT和Midjourney - 免费AIGC工具 - 拼车/合租账号 八折优惠码: AIGCJOEDISCOUNT2024

[AI-人工智能]银河录像局: 国内可靠的AI工具与流媒体的合租平台 高效省钱、现号秒发、翻车赔偿、无限续费|95折优惠码: AIGCJOE

[AI-人工智能]免梯免翻墙-ChatGPT拼车站月卡 | 可用GPT4/GPT4o/o1-preview | 会话隔离 | 全网最低价独享体验ChatGPT/Claude会员服务

[AI-人工智能]边界AICHAT - 超级永久终身会员激活 史诗级神器,口碑炸裂!300万人都在用的AI平台

本文介绍了Linux操作系统下Socket编程的基础知识和实践方法,旨在帮助初学者快速掌握Socket编程技能。教程从Socket的基本概念开始,逐步深入讲解了Socket的创建、连接、数据传输等关键步骤,为菜鸟程序员提供了实用的学习资源。

本文目录导读:

  1. Socket基础概念
  2. Socket编程步骤
  3. 实例

Socket编程是计算机网络编程中非常重要的一部分,它允许程序通过计算机网络进行数据交换,Socket起源于UNIX操作系统,但随着网络技术的发展,Socket编程已经成为了各种操作系统和编程语言中普遍支持的特性,本文将为您介绍Socket编程的基础知识,并通过实例帮助您快速入门。

Socket基础概念

1、Socket

Socket是计算机网络中的一个端点,可以看作是不同计算机上的进程间通信的一个通道,在UNIX系统中,Socket可以看作是一个特殊的文件,用于进程间的通信。

2、端口(Port)

端口是Socket通信中用于区分不同进程的逻辑标识符,每个Socket都会绑定一个端口号,用于网络通信,端口号范围是0~65535,其中0~1023为系统保留端口。

3、地址族(Address Family)

地址族用于指定Socket使用的网络协议族,常见的地址族有IPv4和IPv6,IPv4使用32位地址,而IPv6使用128位地址。

4、传输协议(Transport Protocol)

传输协议定义了Socket通信过程中数据传输的方式,常见的传输协议有TCP(传输控制协议)和UDP(用户数据报协议)。

Socket编程步骤

Socket编程分为服务器端和客户端两个部分,下面分别介绍服务器端和客户端的Socket编程步骤。

1、服务器端

(1)创建Socket

int socket(int domain, int type, int protocol);

domain:地址族,如AF_INET(IPv4)、AF_INET6(IPv6)等。

type:传输协议类型,如SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)等。

protocol:传输协议,通常设置为0,由系统自动选择。

(2)绑定地址

int bind(int sock, const struct sockaddr *addr, socklen_t len);

sock:创建的Socket。

addr:指向地址结构的指针,包含IP地址和端口号。

len:地址结构的长度。

(3)监听

int listen(int sock, int backlog);

sock:创建的Socket。

backlog:允许的最大连接数。

(4)接受连接

int accept(int sock, struct sockaddr *addr, socklen_t *len);

sock:创建的Socket。

addr:指向地址结构的指针,用于保存客户端地址。

len:地址结构的长度。

(5)发送数据

int send(int sock, const void *data, size_t size, int flags);

sock:创建的Socket。

data:发送数据的指针。

size:发送数据的长度。

flags:发送标志,通常设置为0。

(6)接收数据

int recv(int sock, void *data, size_t size, int flags);

sock:创建的Socket。

data:接收数据的指针。

size:接收数据的长度。

flags:接收标志,通常设置为0。

(7)关闭连接

int close(int sock);

sock:创建的Socket。

2、客户端

(1)创建Socket

int socket(int domain, int type, int protocol);

与服务器端相同。

(2)连接服务器

int connect(int sock, const struct sockaddr *addr, socklen_t len);

sock:创建的Socket。

addr:指向服务器地址结构的指针。

len:地址结构的长度。

(3)发送数据

int send(int sock, const void *data, size_t size, int flags);

与服务器端相同。

(4)接收数据

int recv(int sock, void *data, size_t size, int flags);

与服务器端相同。

(5)关闭连接

int close(int sock);

与服务器端相同。

实例

下面提供一个简单的TCP Socket编程实例,实现客户端和服务器端的通信。

1、服务器端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main() {
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_addr, clnt_addr;
    socklen_t clnt_addr_size;
    serv_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (serv_sock == -1) {
        perror("socket");
        exit(1);
    }
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(12345);
    if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
        perror("bind");
        exit(1);
    }
    if (listen(serv_sock, 5) == -1) {
        perror("listen");
        exit(1);
    }
    printf("Server is running...
");
    clnt_addr_size = sizeof(clnt_addr);
    clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
    if (clnt_sock == -1) {
        perror("accept");
        exit(1);
    }
    char buffer[1024];
    while (1) {
        int str_len = recv(clnt_sock, buffer, sizeof(buffer) - 1, 0);
        if (str_len == 0) {
            printf("Client disconnected
");
            break;
        }
        buffer[str_len] = '';
        printf("Received: %s
", buffer);
        send(clnt_sock, buffer, str_len, 0);
    }
    close(clnt_sock);
    close(serv_sock);
    return 0;
}

2、客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main() {
    int sock;
    struct sockaddr_in serv_addr;
    char buffer[1024];
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("socket");
        exit(1);
    }
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serv_addr.sin_port = htons(12345);
    if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
        perror("connect");
        exit(1);
    }
    while (1) {
        printf("Input: ");
        fgets(buffer, sizeof(buffer), stdin);
        send(sock, buffer, strlen(buffer), 0);
        int str_len = recv(sock, buffer, sizeof(buffer) - 1, 0);
        buffer[str_len] = '';
        printf("Received: %s
", buffer);
    }
    close(sock);
    return 0;
}

本文介绍了Socket编程的基础知识,包括Socket的概念、地址族、传输协议等,以及服务器端和客户端的Socket编程步骤,通过一个简单的TCP Socket编程实例,帮助读者快速入门Socket编程,在实际开发中,Socket编程具有广泛的应用场景,掌握Socket编程是网络编程的基础。

关键词:Socket编程, 入门教程, 服务器端, 客户端, 创建Socket, 绑定地址, 监听, 接受连接, 发送数据, 接收数据, 关闭连接, TCP, 实例, 编程步骤, 地址族, 传输协议, 端口, 网络通信, 网络编程, UNIX, 系统保留端口, IPv4, IPv6, 数据传输, 网络协议, 通信通道, 端点, 进程间通信, 系统调用, 网络编程语言, 网络编程技术, 网络编程基础, 网络编程入门, 网络编程实例, 网络编程教程, 网络编程指南, 网络编程书籍, 网络编程资料, 网络编程学习, 网络编程技巧, 网络编程实践, 网络编程案例, 网络编程应用, 网络编程编程, 网络编程编程语言, 网络编程编程技巧, 网络编程编程实践, 网络编程编程指南, 网络编程编程书籍, 网络编程编程资料, 网络编程编程学习, 网络编程编程入门, 网络编程编程实例, 网络编程编程教程, 网络编程编程技巧, 网络编程编程实践, 网络编程编程案例, 网络编程编程应用, 网络编程编程编程, 网络编程编程编程语言, 网络编程编程编程技巧, 网络编程编程编程实践, 网络编程编程编程指南, 网络编程编程编程书籍, 网络编程编程编程资料, 网络编程编程编程学习, 网络编程编程编程入门, 网络编程编程编程实例, 网络编程编程编程教程,

bwg Vultr justhost.asia racknerd hostkvm pesyun Pawns


本文标签属性:

Socket编程入门教程:熟悉socket编程

原文链接:,转发请注明来源!