C语言中的socket编程实例代码

yizhihongxing

当我们需要在计算机程序中实现网络通信时,Socket 编程成为了一种非常重要的方式。C 语言是一种经典的编程语言,通过 C 语言实现 Socket 编程也是非常常见的。在接下来的讲解中,我们将会提供一个 C 语言中的 Socket 编程实例代码的完整攻略,并且会给出两条示例说明,让大家更好地理解代码的运用。

什么是 Socket 编程?

Socket 是一种通信机制,它位于传输层和应用层之间,用于实现网络协议族的通信,比如 TCP 和 UDP。Socket 编程利用 Socket 通信机制,在计算机程序之间实现数据的传输。

Socket 编程通常由客户端和服务端两个部分组成,客户端负责向服务端请求数据或服务,服务端则负责提供数据或服务。在 C 语言中,我们通过调用系统库函数实现 Socket 编程。

C 语言中的 Socket 编程实例代码

下面是一个简单的 C 语言中的 Socket 编程实例代码的模板。在这个示例代码中,我们通过一个简单的示例来说明如何使用 Socket 编程实现客户端向服务端发送一条消息的功能。

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

#define PORT 8080

int main() {
    int client_sock;
    struct sockaddr_in server_addr;
    char buffer[1024] = {0};
    if ((client_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr)<=0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }
    if (connect(client_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }
    char *hello = "Hello from client";
    send(client_sock, hello, strlen(hello), 0);
    printf("Message sent\n");
    return 0;
}

在上述示例代码中,我们可以看到 main 函数中分别完成了以下几个步骤:

  1. Socket 创建:通过调用系统库函数 socket() 创建一个 Socket。
  2. 设定服务器地址:使用结构体 server_addr 设置服务器的地址和端口号。
  3. 连接服务器:通过调用系统库函数 connect() 连接服务器。
  4. 发送消息:通过调用系统库函数 send() 发送消息。

在以上步骤中,我们也使用到了一些系统库函数,包括 socket()、inet_pton()、connect() 和 send() 函数。

示例说明1: Socket 服务端程序

下面是一个简单的 C 语言中的 Socket 服务端程序的示例代码。在这个示例代码中,我们通过使用 Socket 编程,实现了一个简单的 Echo 服务器,当客户端向服务器发送一条消息后,服务器会返回一条 Echo 回应消息。

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

#define PORT 8080

int main() {
    int server_fd, client_sock;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("Socket failed");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    if (listen(server_fd, 3) < 0) {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }

    if ((client_sock = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept failed");
        exit(EXIT_FAILURE);
    }

    int valread = read(client_sock, buffer, 1024);
    printf("%s\n",buffer );
    send(client_sock , buffer , strlen(buffer) , 0 );
    printf("Echo message sent\n");

    return 0;
}

在上述代码中,我们使用到了以下几个系统函数:socket()、bind()、listen()、accept() 和 read() 函数。在服务器程序中,我们设定了 Echo 协议,服务器会将客户端传来的消息原样返回。当客户端请求连接时,服务器调用 accept() 函数接收连接请求,并通过 read() 函数接收客户端传来的消息。接收到消息后,服务器通过 send() 函数将消息返回到客户端。

示例说明2: Socket UDP 通信

TCP 是一种面向连接的协议,它需要在连接建立后才能进行数据传输,而 UDP 是一种无连接的协议,可以直接向对方发送数据包。下面是一个简单的 C 语言中的 Socket UDP 通信的示例代码,它实现了客户端向服务端发送一个数据包的功能。

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

#define PORT 8080

int main() {
    int sock;
    struct sockaddr_in server_addr;
    char buffer[1024] = {0};

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    char *hello = "Hello from client";
    sendto(sock, (const char *)hello, strlen(hello), MSG_CONFIRM, (const struct sockaddr *)&server_addr, sizeof(server_addr));
    printf("Message sent\n");
    close(sock);
    return 0;
}

在 UDP 通信中,我们使用了 SOCK_DGRAM 类型的 Socket,它不需要调用 connect() 函数与对方建立连接,直接调用 sendto() 函数发送数据包即可。

结束语

以上就是关于 C 语言中的 Socket 编程实例代码的一个完整攻略,以及两条示例说明。Socket 编程是非常常见和重要的技能,希望大家通过本文能够更好地理解 Socket 编程的实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中的socket编程实例代码 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现通讯录系统课程设计

    C语言实现通讯录系统课程设计 本次课程设计旨在通过实现一个简单的通讯录系统,帮助初学者巩固C语言基础知识,并初步了解数据结构相关操作和应用。 基本功能 通讯录系统主要包含以下功能: 添加联系人 删除联系人 修改联系人信息 查找联系人 显示所有联系人信息 清空联系人 设计思路 通讯录系统主要使用链表数据结构作为存储方式,并且通过读写文件将链表数据结构永久保存到…

    C 2023年5月23日
    00
  • C语言中static的使用方法实例详解

    C语言中static的使用方法实例详解 介绍 static是C语言中的一个关键字,可以用来修饰变量、函数、和数据结构。在不同的情境下,static有不同的用途和行为。本文将对static关键字的使用方法进行详细讲解,并提供两个具体的使用示例。 修饰变量 在函数内部使用 当static修饰局部变量的时候,变量的生命周期不会随着函数的调用结束而结束,而是会在程序…

    C 2023年5月23日
    00
  • 如何在C++中建立一个顺序表

    建立顺序表的过程可以分为以下几个步骤: 1. 准备工作 在C++中建立顺序表,我们需要先定义一个结构体来表示顺序表的元素,包含数据和序号信息。比如我们可以这样定义: struct ListElement { int data; // 数据 int index; // 序号 } 2. 建立顺序表 接下来我们可以使用一个数组来保存顺序表中的元素,需要先定义数组的…

    C 2023年5月23日
    00
  • C语言职工信息管理系统源码

    C语言职工信息管理系统源码完整攻略 简介 C语言职工信息管理系统源码是一套基于C语言编写的职工信息管理系统。该系统可以方便地实现职工的添加、删除、修改和查询等基本操作,并且提供了良好的用户界面,用户可以通过该系统轻松管理职工信息。 功能模块 C语言职工信息管理系统源码包含了以下几个模块: 主菜单模块:用于显示主菜单和处理用户输入。 增加职工模块:用于增加新的…

    C 2023年5月23日
    00
  • c++ base64编解码使用示例

    C++ Base64编解码使用示例 简介 Base64是一种编码方式,能够将二进制数据转化为可打印的ASCII字符,常用于邮件、XML等文本转移过程中对二进制数据进行编码。C++也提供了Base64编解码的支持,这里就进行一下说明。 Base64编码 Base64编码将三个8位的字节转换为四个6位的字节,即每3个字节将会变成4个字节,更准确的说是每满4个字节…

    C 2023年5月30日
    00
  • C语言中如何进行线程和进程操作?

    C语言在操作系统中提供了一些库函数,可以方便地进行进程和线程的操作。 进程操作 创建新进程 使用 fork() 函数可以在当前进程中创建一个新进程。新进程继承了父进程的所有属性,但是父进程和子进程拥有独立的内存空间。下面是一个示例: #include <sys/types.h> #include <unistd.h> #include…

    C 2023年4月27日
    00
  • C语言中如何控制程序流程?

    控制程序流程是C语言中非常重要的一个方面,主要通过条件语句、循环语句以及函数调用来实现。下面我将详细讲解。 条件语句 条件语句用于根据条件来执行不同的代码块。C语言中,最常用的条件语句为if…else语句和switch语句。 if…else语句 if…else语句用于在满足特定条件时执行代码块。如果条件为真,则执行if代码块,否则执行else代码…

    C 2023年4月27日
    00
  • C++ Boost Atomic详细讲解

    C++ Boost Atomic详细讲解 什么是Boost Atomic? Boost Atomic是C++ Boost库的一个组件,提供了跨平台多线程编程中的原子操作。原子操作是一种不可分割的操作,要么全部完成,要么全部不完成。 如何使用Boost Atomic? 安装Boost库 要想使用Boost Atomic,需要先安装Boost库。可以参考Boos…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部