ftp PORT模式获取数据 accept一直被阻塞 用filezilla主动模式连接是OK的

haicai1989 2019-12-29 09:30:40
struct sockaddr_in addr;
int data_sockfd,conn_sock,port;

conn_sock = socket( PF_INET, SOCK_STREAM, 0 );
if ( conn_sock == -1 )
{
printf("==%d==connect is error\n",__LINE__);
return ;
}

memset( (char *)&addr, 0, sizeof(addr) );
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl( INADDR_ANY );
// addr.sin_port = htons(20);

if( bind(conn_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1 ) {
close( conn_sock );
printf("==%d==connect is error\n",__LINE__);
return ;
}

if( listen(conn_sock, SOMAXCONN) == -1 ) {
close( conn_sock );
printf("==%d==connect is error\n",__LINE__);
return ;
}

len = sizeof( struct sockaddr);
if ( getsockname( conn_sock, (struct sockaddr *)&addr, (socklen_t *)&len ) == -1 )
{
close( conn_sock );
return ;
}
port = addr.sin_port;

if( getsockname( control_sockfd, (struct sockaddr *)&addr, (socklen_t *)&len ) == -1 )//等入的时候创建的socket
{
close( conn_sock );
return ;
}

memset(com,0,64);
memset(recvline,0,FTP_DATE_MAXSIZE);


sprintf( com, "PORT %d,%d,%d,%d,%d,%d\r\n",
addr.sin_addr.s_addr&0x000000FF,
(addr.sin_addr.s_addr&0x0000FF00)>>8,
(addr.sin_addr.s_addr&0x00FF0000)>>16,
(addr.sin_addr.s_addr&0xFF000000)>>24,
port>>8, port&0xff );
if(!ftp_socket_command(com,"200",recvline))
return ; //发送命令后,接受到服务器消息 200 PORT command successful.Consider using PASV ,


struct sockaddr_in peerServer;
int acceptfd = -1;
socklen_t len_1 = sizeof( peerServer );
data_sockfd = accept( conn_sock, (struct sockaddr*)&peerServer, &len_1 );//一直被阻塞
if ( -1 == data_sockfd )
{
printf("==%d==connect is error\n",__LINE__);
return cur_fg_dir;
}
...全文
104 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧