C++如何读取/拆分EPRT命令?

问题描述 投票:0回答:2

我目前正在编写一个 C++ FTP 服务器,我想知道从客户端读取 EPRT 命令的最佳方法是什么。

<< DEBUG INFO. >>: the message from the CLIENT reads: 'EPRT |2|::1|58059|\r\n'                 
                                                             ^   ^   ^                     
                                                    Ip Version   |   |                   
                                                                 |   |                     
                                                    Ipv6 Address-    |               
                                                         Port Number-  

我尝试以多种方式使用 sscanf 函数,但我认为我做的不对。

// method one
int ipVersion;
char* portNum;
char* v6_addr;
int scanned_items = sscanf(receive_buffer, "EPRT |%d|%s|%s|", &ipVersion, &v6_addr, 
                                                                         &portNum);
// method two
int ipVersion;
char* portNum;
char v6_addr[3];
int scanned_items = sscanf(receive_buffer, "EPRT |%d|%s:%s:%s|%s|", &ipVersion, 
&v6_addr[0], &v6_addr[1], &v6_addr[2], &portNum);

我应该以不同的方式存储 IP 地址和端口号吗?有任何想法吗? 谢谢。

c++ server ftp client scanf
2个回答
0
投票
            int ipVersion;
            char ipv6_str[64], rest[47], port[12];
            int scanned_items = sscanf(receive_buffer, "EPRT |%d|%s", &ipVersion, rest);
            char *first = strchr(rest, '|');
            *first = 0;
            scanned_items = sscanf(rest, "%s", ipv6_str);
            char *portT = first + 1;
            char *second = strchr(portT, '|');
            *second = 0;
            scanned_items = sscanf(portT, "%s", port);

如果有人有兴趣


0
投票

您可以使用 sscanf 函数以更简洁的方式完成它。

int af;
char ip_str[40];
int port = -1;
sscanf(receive_buffer, "EPRT |%d|%[^|]|%d|", &af, ip_str, &port)

如果你需要转换成不同的格式,你可以按照你认为合适的方式进行。

通过检查函数是否返回 3,您可以确保它已正确解析。还检查端口不等于 -1 是另一个简单的检查。

© www.soinside.com 2019 - 2024. All rights reserved.