【socket介绍及举例】

本文介绍了Socket通信的底层原理,它是应用层与传输层间产物,将复杂操作封装成简单接口。阐述了Socket通信基本步骤,包括服务器监听、绑定、接受请求等,客户端连接服务器。还说明了在Linux中Socket是网络编程接口,给出了在Linux环境使用Socket的基本步骤及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Socket通信的底层原理基于网络通信中的端点抽象表示,这是网络通信过程中必须的五种信息的组合:连接使用的协议、本地主机地址的IP地址、本地进程的协议端口、远地主机的IP地址和远地进程的协议端口。Socket本质上是应用层与传输层之间的一个产物,它将传输层的复杂操作封装成简单的接口,以供应用程序调用,实现进程中的网络通信。

具体而言,Socket通信的基本步骤如下:首先,服务器创建一个用于监听连接的Socket对象;其次,使用指定的端口号和服务器的IP地址构建一个EndPoint对象;然后,通过Socket对象的Bind()方法将EndPoint绑定到特定的IP地址和端口号;最后,服务器用Listen()方法开始监听客户端发来的连接请求。一旦接收到连接请求,就用Accept()方法接受请求并创建一个新的Socket对象用于与该客户端进行通信。而客户端则使用Connect()方法连接到服务器。

总的来说,Socket提供了一种简化网络编程的方法,隐藏了复杂的网络操作细节,使得开发者能够更加专注于程序的主要功能。

在Linux中,Socket是一种网络编程接口,它提供了在不同主机的进程之间双向数据传输的功能。一个Socket由IP地址和端口号唯一标识,网络上的两个程序可以通过一个双向的通信连接实现数据的交换。

以下是在Linux环境中使用Socket的一些基本步骤及示例:

首先,需要创建一个套接字。在C语言中,这可以通过调用socket()函数实现,它会返回一个整型的套接字文件描述符,这个描述符将作为后续网络操作的句柄。

服务端代码:

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

#define BUF_SIZE 1024

void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    char message[BUF_SIZE];
    int str_len, i;

    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t clnt_adr_sz;

    if (argc != 2) {
        printf("Usage: %s <port>
", argv[0]);
        exit(1);
    }

    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    if (serv_sock == -1)
        error_handling("socket() error");

    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
        error_handling("bind() error");

    if (listen(serv_sock, 5) == -1)
        error_handling("listen() error");

    clnt_adr_sz = sizeof(clnt_adr);
    for (i = 0; i < 5; i++) {
        clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_adr, &clnt_adr_sz);
        if (clnt_sock == -1)
            error_handling("accept() error");
        else
            printf("Connected client %d
", i + 1);

        while ((str_len = read(clnt_sock, message, BUF_SIZE)) != 0)
            write(clnt_sock, message, str_len);

        close(clnt_sock);
    }

    close(serv_sock);
    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('
', stderr);
    exit(1);
}

客户端代码:

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

#define BUF_SIZE 1024

void error_handling(char *message);

int main(int argc, char *argv[])
{
    int sock;
    char message[BUF_SIZE];
    int str_len;

    struct sockaddr_in serv_adr;
    socklen_t serv_adr_sz;

    if (argc != 3) {
        printf("Usage: %s <IP> <port>
", argv[0]);
        exit(1);
    }

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock == -1)
        error_handling("socket() error");

    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_adr.sin_port = htons(atoi(argv[2]));

    if (connect(sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
        error_handling("connect() error");
    else
        puts("Connected...");

    while (1) {
        fputs("Input message(Q to quit): ", stdout);
        fgets(message, BUF_SIZE, stdin);

        if (!strcmp(message, "q
") || !strcmp(message, "Q
"))
            break;

        write(sock, message, strlen(message));
        str_len = read(sock, message, BUF_SIZE - 1);
        message[str_len] = 0;
        printf("Message from server: %s", message);
    }

    close(sock);
    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('
', stderr);
    exit(1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zero2100

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值