我编写了一个FTP客户端,自动进入被动模式,然后通过给定的IP和端口连接到服务器。
通常它有效。有时却没有。
您认为可能是因为服务器还没有时间打开端口吗?为什么服务器会拒绝我的连接?
int sockfd;
int len;
struct sockaddr_in address;
int result;
/* Create a socket for the client. */
sockfd = socket(PF_INET, SOCK_STREAM, 0);
/* Name the socket, as agreed with the server. */
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr( hostname );
address.sin_port = htons( port );
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops (data): client3");
printf("thread%i %s:%i\n", thread_name, hostname, prt);
exit(1);
}
只是寻找具有套接字编程经验的人的一些见解。
注意:此客户端是多线程的。这个想法是从n个服务器中的1个下载文件的1 / n。当我尝试在多个线程中连接多个相同的服务器时,最常发生这种情况,但这不是排他性的 - 也就是说,它也可能发生在两个完全独立的服务器上。
修改
事实证明,我的算法存在错误。在解析服务器响应(以这种形式返回IP和端口:127,0,0,1,0,20)之间,我不知何故忘记将我正在使用的某个内存块清零并最终写入以前的一些端口号。当覆盖数量较大时,没有问题。但是,当它更小时,剩余的数字会导致问题。例如:
Last Port Calculation = 54321
Current Port Calculation = 9876
Current Port Stored as... 98761 <- appending the 1 to the port number
这导致服务器正确拒绝我的连接。
所以,最后,程序员的错误。 :)
答案 0 :(得分:2)
也可能是因为服务器没有足够快地接受新连接并且他的接受缓冲区已经满了。