2011-03-27 126 views
1

我想创建一个ftp客户端上传文件功能。但是,套接字不会将消息发送到服务器,即使它获得了与服务器的连接。看下面的代码vC++ - 套接字不写入端口

#include <iostream> 
#include <string> 
#include <tchar.h> 
#include <Winsock2.h> 

#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc,wchar_t * argv[]) 
{ 

    WSADATA wsaData = {0}; 
    int iResult = 0; 

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 

    if (iResult != 0) 
    { 
     wprintf(L"WSAStartup failed: %d\n", iResult); 
     return 1; 
    } 

    SOCKET sock= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if (sock == INVALID_SOCKET) 
     wprintf(L"socket function failed with error = %d\n", WSAGetLastError()); 
    else 
     std::wcout << " Success occured in socket creation " << std::endl ; 

    SOCKADDR_IN sock_Addr={0}; 
    sock_Addr.sin_family=AF_INET; 
    sock_Addr.sin_port=htons(21); 
    sock_Addr.sin_addr.S_un.S_addr=inet_addr("10.0.0.105"); 

    char recv_Buf[1000]={'\0'}; 
    if(connect(sock,(SOCKADDR *)&sock_Addr,sizeof(SOCKADDR_IN)) != 0) 
     std::cout << " Error in connection " << std::endl ; 
    else 
    { 
     std::string tmp; 
     u_long mode =1; // non blocking socket 
     ioctlsocket(sock,FIONBIO,&mode); 
     int result = recv(sock,recv_Buf,sizeof(recv_Buf),0); 
     while(result > 0) 
     { 
      tmp=tmp+recv_Buf; 
      result = recv(sock,recv_Buf,sizeof(recv_Buf),0); 
     } 
     std::cout << "connection - success - " << tmp << std::endl ; 
    } 

    ioctlsocket(sock,FIONBIO,0); 
    std::string buf="USER administrator"; 
    if(send(sock,buf.c_str(),buf.size(),0)== SOCKET_ERROR) 
    std::cout << " sending user - error " << WSAGetLastError() << std::endl ; 
    else 
    { 
     std::string tmp; 
     u_long mode =1; // non blocking socket 
     ioctlsocket(sock,FIONBIO,&mode); 
     int result = recv(sock,recv_Buf,sizeof(recv_Buf),0); 
     while(result > 0) 
     { 
      tmp=tmp+recv_Buf; 
      result = recv(sock,recv_Buf,sizeof(recv_Buf),0); 
      std::cout << "received " << recv_Buf << std::endl ; 
     } 
     std::cout << "user - success - " << tmp << std::endl ; 
    } 
} 

注意:我正在使用filezilla要检查此。它会显示传入连接和命令。所以如果有人在这个问题上指导我,我会很感激你。

编辑 下面是客户端(我身边)命令提示符结果

成功的套接字创建发生

连接 - 成功 - 220-的FileZilla Server版本0.9.37 Beta版

由Tim Kosse编写([email protected]

220请访问http://sourceforge.net/projects/filezilla/

用户 - 成功 -

按任意键继续。 。 。

这一个在服务器侧

(000007)2011年5月17日23时32分02秒PM被显示 - (未登录)(10.0.0.105)>连接,发送欢迎消息.. 。

(000007)2011年5月17日23时32分02秒PM - (未登录)(10.0.0.105)> 220-FileZilla中服务器版本0.9.37测试

(000007)5/17/2011 23:32:02 PM - (not logged in)(10.0.0.105)> 220由Tim Kosse撰写([email protected]

(000007) 5/17/2011 23:32:02 PM - (没有登录)(10.0.0.105)> 220请访问http://sourceforge.net/projects/filezilla/

(000007)2011/5/17 23:32:02 - (没有登入)(10.0.0.105)>断开连接。

+0

我没有仔细看过你的代码,但FTP命令是由回车换行符(\ r \ n)终止的。我没有看到你的USER命令字符串中。 – 2011-03-27 06:47:33

+0

@Peter Wow,你完全明白这一点。给这个评论作为答案,然后只有我可以投票。 – prabhakaran 2011-03-27 06:52:14

+0

@prabhakaran:完成。我在20年前写了一个FTP服务器。啊回忆:)。 – 2011-03-27 06:54:54

回答

3

FTP命令以回车换行符对(\ r \ n)结束。您需要将\ r \ n添加到您的USER命令字符串中。

编辑:您应该咨询RFC 959获取更多信息(还有更多FTP相关的RFC可以更新和扩展RFC 959)。它有一个详细介绍基本FTP命令的部分,并显示了预期的格式,包括<CRLF>对。