c - accept() 一直返回 0

标签 c sockets network-programming server

这是一个简单的服务器,只接受连接,然后打印套接字描述符。出于某种原因,每当我运行它时,我收到的唯一套接字描述符的值为 0。这甚至发生在多个客户端同时连接的情况下。我似乎误解了与 accept() 的行为有关的事情,或者我的代码中存在一些我无法找到的错误。这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

/* Utility for consisely killing the program. */
void abort_program(const char *error_message)
{
    fputs(error_message, stderr);
    exit(EXIT_FAILURE);
}

/* Establishes a passive listening port, returns socket descriptor. */
int setup_passive_port(int port)
{
    struct protoent *ptrp;  // pointer to a protocol table entry
    struct sockaddr_in sad; // structure to hold server's address
    int     sd;             // socket descriptor for listening

    /* Map TCP transport protocol name to protocol number. */
    if (((long int) (ptrp = getprotobyname("tcp"))) == 0) 
        abort_program("ERROR: Cannot map TCP to protocol number\n");

    /* Create a socket. */
    sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);
    if (sd < 0) 
        abort_program("ERROR: Socket creation failed\n");

    /* Prepare the socket address structure. */
    memset((char *) &sad, 0, sizeof(sad));
    sad.sin_family = AF_INET; 
    sad.sin_addr.s_addr = INADDR_ANY;
    sad.sin_port = htons((u_short) port);

    /* Bind a local address to the socket. */
    if (bind(sd, (struct sockaddr*) &sad, sizeof(sad)) < 0)
        abort_program("ERROR: Bind failed\n");

    /* Establish passive listener socket. */
    if (listen(sd, 0) < 0)
        abort_program("ERROR: Listen failed\n");    

    return sd;
}

int main(int argc, char *argv[])
{
    struct sockaddr_in cad; // structure to hold client's address
    int     alen;           // length of address
    int     sd;             // incoming socket
    int     listener;       // listening socket

    listener = setup_passive_port(30000);

    while (1) {

        if (sd = accept(listener, (struct sockaddr*) &cad, &alen) < 0)
            abort_program("ERROR: Accept failed\n");

        printf("%d\n", sd);

    }

}

你能帮我理解为什么吗?感谢您的考虑。

最佳答案

您需要做的一件事是在调用 accept() 之前将 alen 设置为 sizeof(sockaddr_in)。另一个是至少 clang 提示你的 if(accept()...) 行中缺少括号。这里是固定版本。

telnet localhost 30000 按预期工作。

同时将您的 int alen 更改为 socklen_t alen。

int main(int argc, char *argv[])
{
    struct sockaddr_in cad; // structure to hold client's address
    socklen_t     alen = sizeof(sockaddr_in);           // length of address
    int     sd;             // incoming socket
    int     listener;       // listening socket

    listener = setup_passive_port(30000);

    while (1) {

        if ((sd = accept(listener, (struct sockaddr*) &cad, &alen)) < 0)
            abort_program("ERROR: Accept failed\n");

        printf("%d\n", sd);

    }

}

关于c - accept() 一直返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28369043/

相关文章:

c - char指针数组中的多个字符串输入

Java Socket 非阻塞读

Java:无法从套接字获取 ObjectInputStream

Java套接字: Connection reset

c# - 对 SSPI 的调用失败,请参阅内部异常 - 无法联系本地安全机构

java - TCP 套接字上的 Ascii

c - C 中的 x64 内联汇编

C - 读取文件和 strtok 到数组

c - 函数声明的含义

c - C 中用于网络编程的 accept() 函数