为什么 strcmp 函数不将收到的用户命令与 LIST 进行比较(没有 strcmp 函数工作)
Why strcmp function is not comparing the received command from the user with LIST ( without strcmp the function is working )
我是套接字编程的新手,我正在编写一个没有客户端的FTP服务器
我必须使用 netcat 本地主机端口
访问服务器
void do_job(int fd)
{
i,client;
char command[DEFAULT_BUFLEN];
while((client =recv(fd, command, strlen(command), 0)) >0 )
{
if (strcmp(command,"LIST") ==0)
{
}
在主函数中:
if ((pid=fork()) == 0) {
close(listenfd);
do_job(fd);
printf("Child finished their job!\n");
close(fd);
exit(0);
}
您需要在字符串中添加空终止符才能使用 strcmp()
。此外,如果他们键入以换行符结尾的行,则该字符将在 command
中,因此您需要将其包含在要比较的字符串中。
当调用 recv()
时,第三个参数应该是您可以在缓冲区中存储的最大数量。 strlen(command)
returns 缓冲区中已存在但尚未初始化的字符串的长度。您可以使用 DEFAULT_BUFLEN
,然后减去 1 以便为将要添加的空终止符留出空间。
void do_job(int fd)
{
i,client;
char command[DEFAULT_BUFLEN];
while((client =recv(fd, command, DEFAULT_BUFLEN - 1, 0)) >0 )
{
command[client] = '[=10=]'; // add null terminator
if (strcmp(command,"LIST\n") ==0)
{
}
代码有很多问题。您正在将 strlen
应用于未初始化的数组。这是未定义的行为,在实际操作中可能 return 从 0 到超过数组大小的任何值。
recv
函数从字节流中填充缓冲区;它不会 return 以 null 结尾的字符串,也不会从流中提取行。 recv
将愉快地读取网络输入流的片段,该片段开始于一个命令的中间,结束于另一个命令的中间。
在实际的 FTP 协议中,命令无论如何都不会是空终止字符串。
FTP commands are "Telnet strings" terminated by the "Telnet end of
line code" [RFC 959, 4.1.3, P. 34]
基本上整个方法太简单了,不可行;该程序需要对网络输入进行某种字符流抽象,以便它可以正确解析协议。
我是套接字编程的新手,我正在编写一个没有客户端的FTP服务器 我必须使用 netcat 本地主机端口
访问服务器void do_job(int fd)
{
i,client;
char command[DEFAULT_BUFLEN];
while((client =recv(fd, command, strlen(command), 0)) >0 )
{
if (strcmp(command,"LIST") ==0)
{
}
在主函数中:
if ((pid=fork()) == 0) {
close(listenfd);
do_job(fd);
printf("Child finished their job!\n");
close(fd);
exit(0);
}
您需要在字符串中添加空终止符才能使用 strcmp()
。此外,如果他们键入以换行符结尾的行,则该字符将在 command
中,因此您需要将其包含在要比较的字符串中。
当调用 recv()
时,第三个参数应该是您可以在缓冲区中存储的最大数量。 strlen(command)
returns 缓冲区中已存在但尚未初始化的字符串的长度。您可以使用 DEFAULT_BUFLEN
,然后减去 1 以便为将要添加的空终止符留出空间。
void do_job(int fd)
{
i,client;
char command[DEFAULT_BUFLEN];
while((client =recv(fd, command, DEFAULT_BUFLEN - 1, 0)) >0 )
{
command[client] = '[=10=]'; // add null terminator
if (strcmp(command,"LIST\n") ==0)
{
}
代码有很多问题。您正在将 strlen
应用于未初始化的数组。这是未定义的行为,在实际操作中可能 return 从 0 到超过数组大小的任何值。
recv
函数从字节流中填充缓冲区;它不会 return 以 null 结尾的字符串,也不会从流中提取行。 recv
将愉快地读取网络输入流的片段,该片段开始于一个命令的中间,结束于另一个命令的中间。
在实际的 FTP 协议中,命令无论如何都不会是空终止字符串。
FTP commands are "Telnet strings" terminated by the "Telnet end of line code" [RFC 959, 4.1.3, P. 34]
基本上整个方法太简单了,不可行;该程序需要对网络输入进行某种字符流抽象,以便它可以正确解析协议。