[英]send() and puts() are mixed together, (programming a FTP server in C)
我正在用C做一個FTP服務器。在客戶端,我正在使用FileZilla。 到目前為止,我的代碼僅包含握手部分。
我遇到的問題是,我為終端打印的字符串已發送到FileZilla。 我的問題是如何將這兩部分分開,我已經嘗試了幾件事,但是沒有一個能給出正確的結果。
這只是我的代碼的一部分,但是對於我的問題,這是有用的部分:
while (FOREVER){
addr_size = sizeof their_addr;
newfd = accept(listener, (struct sockaddr*) &their_addr, &addr_size);
if (newfd == -1){
perror("accept");
continue;
}
if ((send(newfd, "220 JEDI FTP is ready", 50, 0)) <= 0)
perror("error sending");
puts("connection established");
puts("waiting for user & connection");
while (!login){
// username
if (!user){
if ((recv(newfd, buffer, BUFFCON, 0)) <= 0){
puts("error receiving username");
}
else{
if (strstr(buffer, "USER") != NULL){
if (strstr(buffer, name) != NULL){
send(newfd, "331 password required", 50, 0);
puts("username correct");
user = 1;
}
else{
puts("username incorrect");
send(newfd, "430 username incorrect", 50, 0);
}//else
}//if
}//else
}//if user
這是FileZilla中的輸出:
因此,它發送的不是“ 331需要密碼”,而是發送的“已建立連接”
希望您能對此有所幫助,非常感謝。
問題是您send
的len
參數太大。 send
沒有以null結尾的字符串的概念; 它僅適用於原始字節序列。 因此,調用send(newfd, "220 JEDI FTP is ready", 50, 0)
發送字符串"220 JEDI FTP is ready"
,然后所有后續的操作都將存儲在內存中。 從技術上講,這是未定義的行為 ,因此實際上任何事情都可能發生(通常是段錯誤)。 在您的情況下,由於常量文字字符串通常順序存儲在內存中,因此send
讀取給定的字符串,然后讀取其后的另一個字符串。
你想要做的是只發送確切的字符串(其中,順便說一句,需要CR-LF序列\\r\\n
每個命令后)。 不多不少。 你可以實現一個sends
函數來發送一個字符串,如下所示:
ssize_t sends(int fd, const char *str)
{
size_t len = strlen(str);
return send(fd, str, len, 0);
}
還要注意,發送的數據不包含空終止符,因為TCP數據包指定了字符串的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.