我试图让CFtpServer的第一个例子程序在Windows 7 Pro x64系统上运行。拐弯抹角经过多次殴打,不相信我所看到的,我得到了这个问题下面的这个简单的程序:为什么Windows 7防火墙阻止PASV FTP连接?
#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命令连接到这个“服务器”,我看到一些字符串,然后套接字将关闭(由'服务器'打印的错误是10053)。
如果我禁用了Windows防火墙,只要我关心离开nc命令就可以看到字符串。
我见过两种不同的变化,我不知道是什么导致了这种差异:有时它会在传输字符串'227'时停止,后来它开始死于'229'。它让每一个对发送的文本都敏感的表象。