2015-01-17 20:00:57|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
int CFTP::ftp_connect(int timeout) { m_sockctrl = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //设置超时 if (setsockopt(m_sockctrl,SOL_SOCKET,SO_RCVTIMEO, (const char*) &timeout,sizeof(timeout)) == -1) { perror("setsockopt"); closesocket(m_sockctrl); return -1; } if(0==m_sockctrl) return -1; struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(21); addr.sin_addr.s_addr = inet_addr(m_ip); int err = connect(m_sockctrl,(sockaddr*)&addr,sizeof(addr)); if(err) return -1; //220 Microsoft FTP Service err = recv_buf(m_resp,sizeof(m_resp)); if(err || get_state_code(m_resp) != 220) return -1; return 0; }
参数timeout用来设置SOCKET的超时时间,单位为毫秒,SOCKET的创建使用socket函数完成,该函数有三个参数,函数的具体解释可以参考:C/C++编程之socket基本函数的用法。SOCKET的参数设置使用setsockopt,如果出错该函数返回-1。通过socket函数创建SOCKET以后,就可以使用connect函数建立与服务器的连接。同样,该函数的用法可以参考:C/C++编程之socket基本函数的用法。连接成功以后,FTP服务器会返回对应的提示信息,我们调用函数recv_buf接收服务器的返回内容,get_state_code函数可以从服务器的返回内容提取对应的返回码。
//接收FTP服务器的返回内容 int CFTP::recv_buf(char* recv_buf,int buf_length) { memset(recv_buf,'