我正在用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。
我不熟练使用C语言,而且我是套接字和网络的初学者,所以任何帮助都会受到赞赏。