首页 > 编程笔记

C语言socket网络编程

C语言是一门广泛应用于嵌入式系统、系统编程和网络编程等领域的编程语言。而 Socket 编程是一种常用的网络编程方式,它提供了一套网络通信接口,使得计算机程序可以通过网络进行通信。本文将为您介绍 C语言中的 Socket 网络编程,并为您提供一些简单易懂的示例代码。

Socket是什么?

Socket 是一种抽象的概念,它是一种网络通信机制的统称。在 Unix 操作系统中,Socket 被视为一种文件描述符,与普通文件操作的函数(如 open()、read() 和 write() 等)相似。Socket 通常用于基于 TCP/IP 协议栈的网络编程,它能够使得网络中的不同主机之间能够互相通信。

建立Socket连接

在 Socket 编程中,需要建立连接来进行通信。建立连接的过程可以分为服务器端和客户端两个步骤。

服务器端

服务器端的主要任务是监听网络端口,等待客户端的连接请求。当一个客户端请求连接时,服务器端将为其分配一个新的 Socket 描述符,然后利用这个 Socket 与客户端进行通信。

下面是一个简单的服务器端代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main(void)
{
    // 创建Socket描述符
    int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    // 将Socket与IP地址和端口号绑定
    struct sockaddr_in serv_addr;
    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);
    bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    // 进入监听状态
    listen(serv_sock, 5);

    // 接受客户端的连接请求
    struct sockaddr_in clnt_addr;
    socklen_t clnt_addr_size = sizeof(clnt_addr);
    int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

    // 向客户端发送数据
    char str[] = "Hello World!";
    write(clnt_sock, str, sizeof(str));

    // 关闭Socket
    close(clnt_sock);
    close(serv_sock);

    return 0;
}
上述代码中,我们首先使用 socket() 函数创建了一个 Socket 描述符,指定了协议族为 AF_INET、传输协议为 SOCK_STREAM(即 TCP/IP 协议)和协议号为 IPPROTO_TCP。

接着,使用 bind() 函数将 Socket 与 IP 地址和端口号绑定。其中,INADDR_ANY 表示任何 IP 地址都可以与之通信,而 htons() 函数用于将主机字节序转换为网络字节序。

然后,使用 listen() 函数将 Socket 设置为监听状态,参数 5 表示可以同时连接的客户端数量上限为 5。

最后,使用 accept() 函数等待客户端的连接请求,并为其分配一个新的 Socket 描述符。当客户端连接成功后,我们向其发送了一条“Hello World!”的消息,并关闭了 Socket。

客户端

客户端的主要任务是向服务器端发起连接请求,并进行通信。客户端需要知道服务器端的 IP 地址和端口号才能与其建立连接。

下面是一个简单的客户端代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main(void)
{
    // 创建Socket描述符
    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    // 向服务器端发起连接请求
    struct sockaddr_in serv_addr;
    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);
    connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    // 接收服务器端的数据
    char buf[1024];
    read(sock, buf, sizeof(buf) - 1);

    printf("Message from server: %s\n", buf);

    // 关闭Socket
    close(sock);

    return 0;
}
上述代码中,我们首先使用 socket() 函数创建了一个 Socket 描述符,同样指定了协议族为 AF_INET、传输协议为 SOCK_STREAM 和协议号为 IPPROTO_TCP。

接着,使用 connect() 函数向服务器端发起连接请求,并指定服务器端的IP地址和端口号。其中,inet_addr() 函数用于将字符串类型的 IP 地址转换为网络字节序的二进制值。

然后,使用 read() 函数接收服务器端发送的数据,并打印输出。最后,关闭 Socket。

Socket编程中常用的函数

下面是 Socket 编程中常用的一些函数:

总结

Socket 编程是一种常用的网络编程方式,它能够实现不同主机之间的通信。在 C语言中,我们可以使用 Socket 编程实现服务器端和客户端之间的数据传输。本文为您介绍了 C语言中 Socket 编程的基本知识,并提供了一些简单易懂的示例代码,希望能够对您有所帮助。

推荐阅读