尝试写入时,套接字冻结

时间:2017-01-06 23:13:36

标签: c sockets networking tcp ftp

我正在用C语言写一个FTP服务器。目前我正在努力建立被动连接。我通过套接字保持连接,我有两个。第一个是const int a_socket,它是在客户端连接时创建的,它接受所有客户端命令并从服务器发送响应代码。第二个是int p_socket,它仅在客户端请求被动模式时才连接它应该发送大数据。当我尝试通过p_socket发送任何内容时出现错误 - 服务器卡在write函数中,而客户端(我目前正在针对Filezilla进行测试)收到ECONNRESET。服务器似乎也在发送RST而不是消息。

我使用create_socket

创建套接字
int create_socket(int *ap_socket, const int a_port) {
    // variables
    struct sockaddr_in serverAddr;
    int yes = 1;

    // create address
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(a_port);

    // create socket
    if ((*ap_socket = socket(serverAddr.sin_family, SOCK_STREAM, 0)) < 0) {
        perror("service_create(): create socket");
        return 0;
    }

    // set options
    if (setsockopt(*ap_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
        perror("service_create(): socket opts");
        return 0;
    }

    // bind socket
    if (bind(*ap_socket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {
        perror("service_create(): bind socket");
        close(*ap_socket);
        return 0;
    }

    // listen to socket
    if (listen(*ap_socket, SERVER_SOCKET_BACKLOG) < 0) {
        perror("service_create(): listen socket");
        close(*ap_socket);
        return 0;
    }

    return 1;
}

客户端在两个套接字上连接都没有问题,但只有a_socket能够发送任何数据。我使用以下函数来检查套接字。

int check_socket(const int sd) {
    int result = write(sd, "\0", 2);
    if (result >= 0) {
        return 1;
    }
    else {
        return 0;
    }
}

我正在使用wireshark来查看数据包,我在localhost上进行了所有测试。套接字a_socket连接客户端 端口43684到服务器上的FTP端口21(在日志中看不到)。服务器为被动连接提供端口20,客户端通过端口50601连接。

日志的最后三行显示check_socket的结果。从a_socket(\ 000 \ 000)发送的测试消息到达正常并由客户端确认,但是从p_socket发送的相同消息会在下一行产生RST。

Wireshark records

我不熟练使用C语言,而且我是套接字和网络的初学者,所以任何帮助都会受到赞赏。

0 个答案:

没有答案