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,'