为什么Windows 7防火墙会阻止PASV FTP连接?

时间:2013-02-27 19:26:06

标签: sockets windows-7 ftp windows-firewall

我试图让CFtpServer的第一个示例程序在Windows 7 Pro,x64系统上运行。在布什周围多次殴打并且不相信我所看到的之后,我将问题归结为以下简单程序:

#include <iostream>
using namespace std;

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>


#define die(code) { cerr << "die at " << __FILE__ << " " << __LINE__ << " "; exit(code); }

int main(int argc, char **argv)
{
    short port = 21;

    if (argc == 2) {
        port = atoi(argv[1]);
    }

    WSADATA WSAData;
    if ( WSAStartup( MAKEWORD(2, 2), &WSAData) != 0)
        die(1);

    SOCKET ls = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//!!! proto 0 in ftpdmin!
    if (ls == INVALID_SOCKET) die(1);

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons( port );

    if (bind( ls, (struct sockaddr *) &sin, sizeof( struct sockaddr_in ) )
            == SOCKET_ERROR) die(2);

    if (listen( ls, 1 ) == SOCKET_ERROR ) //!!! backlog 1 in ftpdmin!
        die(3);


    // wait for connect, transmit till error
    SOCKET ts;
    for( ;; ) {
        ts = accept( ls, NULL, NULL );
        if (ts == INVALID_SOCKET) die(5);

        // now write some things to that socket.
        int i=0;
        for(;;) {
            char buf[256];
            sprintf(buf, "%d Testing...\r\n",i+224);
            if (send(ts, buf, strlen(buf), 0) < 0) {
                DWORD err = WSAGetLastError();
                cerr << "send failed with " << err << endl;
                break;
            }
            Sleep(1000);
            i = (i+1)%10;
        }

        Sleep(1000);
        closesocket(ts);
    }
}

该程序打开指定的套接字,监听它的连接。当它获得连接时,它继续写入与FTP服务器可能用于响应PASV命令的字符串相似的字符串。它将继续传输字符串,每秒一次,直到出现问题。

在我的系统上,使用nc.exe命令连接到这个'服务器',我看到几个字符串,然后套接字将关闭('server'打印的错误是10053)。

如果我禁用了Windows防火墙,只要我不想让nc命令运行,我就会看到字符串。

我已经看到了两种不同的变化,我不知道是什么导致了差异:有时它会在传输字符串'227'时停止,之后它会在'229'开始死亡。它使每一种外观都对发送的文本敏感。

1 个答案:

答案 0 :(得分:2)

经过3天的打击,我有一个答案:窗口KB2754804。这是一个错误,自2011年以来MS已知。在引用的知识库文章中有一个Hotfix,但它似乎不适用于我的测试,所以我不得不采取禁用状态FTP防火墙的替代路由。

我终于从this SO条目中找到了KB文章。