首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

套接字如何在C中工作?

套接字(socket)是计算机网络编程中的一个核心概念,它是一种通信管道,用于在不同计算机之间实现数据交换。在C语言中,套接字通信通常使用BSD套接字库(也称为POSIX套接字)进行实现。

套接字的工作原理可以分为以下几个步骤:

  1. 创建套接字:使用socket()函数创建一个套接字,指定协议类型(如TCP或UDP)和通信类型(如IPv4或IPv6)。
  2. 绑定地址:使用bind()函数将套接字绑定到一个特定的IP地址和端口号,以便其他计算机可以找到它。
  3. 监听连接:对于TCP套接字,使用listen()函数启动监听,等待客户端连接。
  4. 接受连接:对于TCP套接字,使用accept()函数接受客户端连接,并返回一个新的套接字描述符,用于与客户端通信。
  5. 发送和接收数据:使用send()和recv()函数发送和接收数据。
  6. 关闭套接字:使用close()函数关闭套接字。

以下是一个简单的TCP服务器示例:

代码语言:c
复制
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>

int main(int argc, char *argv[]) {
    int sockfd, newsockfd, portno, clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s <port>\n", argv[0]);
        exit(1);
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("bind");
        exit(1);
    }

    listen(sockfd, 5);
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("accept");
        exit(1);
    }

    bzero(buffer, 256);
    n = read(newsockfd, buffer, 255);
    if (n < 0) {
        perror("read");
        exit(1);
    }

    printf("Received: %s\n", buffer);

    n = write(newsockfd, "I got your message", 18);
    if (n < 0) {
        perror("write");
        exit(1);
    }

    close(newsockfd);
    close(sockfd);

    return 0;
}

在这个示例中,我们创建了一个TCP套接字,绑定到指定的IP地址和端口号,并监听连接。当客户端连接时,我们接受连接并读取客户端发送的数据,然后发送一个响应。最后,我们关闭套接字。

总之,套接字是计算机网络编程中的一个重要概念,它提供了一种简单而有效的方式来实现网络通信。在C语言中,套接字通信通常使用BSD套接字库进行实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Golang中用到的的Websocket库

在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开发者社区已经从 HTTP 长轮询和 AJAX 走了很长一段路,终于找到了构建真正实时应用程序的解决方案。该解决方案以 WebSockets 的形式出现,它可以在用户的浏览器和服务器之间打开交互式会话。WebSockets 允许浏览器向服务器发送消息并接收事件驱动的响应,而无需轮询服务器以获取回复。目前,WebSockets 是构建实时应用程序的首选解决方案:在线游戏、即时通讯工具、跟踪应用程序等。本指南解释了 WebSockets 的运行方式,并展示了我们如何使用 Go 编程语言构建 WebSocket 应用程序。

02

Redis 线程模型

【1】Redis 是基于 Reactor 模式开发的网络事件处理器:这个处理器被称为文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型: ■ 文件事件处理器使用 I/O 多路复用(multiplexing)机制监听多个套接字 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。 ■ 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时。与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。 【2】虽然文件事件处理器以单线程的方式运行,但其使用 I/O 多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与 Redis 服务器中其他同样以单线程方式运行的模块进行对接,这保持了 Redis 内部单线程设计的简单性。

02
领券