当你在Linux上使用socket编程时,调用listen函数将socket设置为监听状态,等待连接请求。但是,只调用listen函数是不会执行accept操作的。

accept操作是在有连接请求到达时,通过调用accept函数来接受连接,并创建一个新的socket来处理该连接。因此,如果你只调用listen函数而不调用accept函数,那么你的程序将一直处于监听状态,但不会处理任何连接请求。

要处理连接请求,你需要在调用listen函数后,使用accept函数来接受连接。一般的做法是将accept函数放在一个循环中,以便能够接受多个连接请求。

以下是一个简单的示例代码,演示了如何使用socket编程在Linux上监听连接请求并接受连接:

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

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

    // 创建socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Error opening socket");
        exit(1);
    }

    // 设置服务器地址
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 1234;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    // 绑定socket
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("Error on binding");
        exit(1);
    }

    // 监听连接请求
    listen(sockfd, 5);

    // 接受连接请求并处理连接
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("Error on accept");
        exit(1);
    }

    // 处理连接
    bzero(buffer, 256);
    n = read(newsockfd, buffer, 255);
    if (n < 0) {
        perror("Error reading from socket");
        exit(1);
    }
    printf("Message from client: %s\n", buffer);

    // 关闭socket
    close(newsockfd);
    close(sockfd);

    return 0;
}

在上述示例中,我们创建了一个socket,设置服务器地址,绑定socket,并调用listen函数开始监听连接请求。然后,我们使用accept函数来接受连接请求并创建一个新的socket来处理连接。在处理连接时,我们读取客户端发送的消息并打印出来。最后,我们关闭连接的socket。

请注意,这只是一个简单的示例代码,没有处理多个连接请求或错误处理。在实际的应用中,你可能需要使用多线程或多进程来处理多个连接请求,并进行适当的错误处理。

linux socket只执行listen不执行accept

原文地址: https://www.cveoy.top/t/topic/iLg9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录