为什么 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]

基本上整个方法太简单了,不可行;该程序需要对网络输入进行某种字符流抽象,以便它可以正确解析协议。