社区
Linux/Unix社区
帖子详情
ftp port方式编程求助
happyzhang
2007-04-26 12:57:02
今天遇到一个奇怪的问题,在调试一ftp port方式的client端程序,第一次数据通道连接成功,传送数据也正常。完成本次操作,关闭数据连接,接着又进行第二次数据连接,却发现client端在accept()函数处堵住。两次侦听的是同一个端口,怀疑是前一次的连接没有释放,端口还是被占用,可是用netstat 看了一下我侦听的那个端口,是没有连接的,怎么第二次建立数据连接就堵住了呢?还请高手指点啊,最有可能哪里出问题了呢?
...全文
274
7
打赏
收藏
ftp port方式编程求助
今天遇到一个奇怪的问题,在调试一ftp port方式的client端程序,第一次数据通道连接成功,传送数据也正常。完成本次操作,关闭数据连接,接着又进行第二次数据连接,却发现client端在accept()函数处堵住。两次侦听的是同一个端口,怀疑是前一次的连接没有释放,端口还是被占用,可是用netstat 看了一下我侦听的那个端口,是没有连接的,怎么第二次建立数据连接就堵住了呢?还请高手指点啊,最有可能哪里出问题了呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mymtom
2007-07-18
打赏
举报
回复
这个不是Linux下的代码,是Windows下的。
第二个问题是C++的基本概念,随便找本书都有,看看这个:
http://www.pconline.com.cn/pcjob/process/other/others/0407/423693.html
yandw
2007-07-17
打赏
举报
回复
to mymtom 老兄:
using namespace std;
这句是什么意思呀,
到那里 STD?
#include <winsock.h>?,这不是LINUX下的代码吗?怎么还要这个?
mymtom
2007-04-27
打赏
举报
回复
试试下面的程序!
#include <string>
#include <iostream>
using namespace std;
#include <winsock.h>
#define HOST "host.domain.com"
#define USER "user"
#define PASS "password"
#define CRLF "\r\n"
#define CR "\r"
#define LF "\n"
#define MAX_RECV_LEN 40960
#define SA struct sockaddr
typedef int socklen_t;
int main()
{
SOCKET sockfd, listenfd, datafd;
WSADATA wsaData;
struct sockaddr_in server_addr, data_addr, listen_name;
socklen_t data_addrlen, listen_namelen;
struct hostent *hp;
string strSend;
string strRecv;
char bufRecv[MAX_RECV_LEN + 1];
int nSend, nRecv, nRet;
struct timeval tm;
fd_set readfds;
// Initialize
if (WSAStartup(MAKEWORD(2,1),&wsaData)!=0)
{
WSACleanup();
exit(1);
}
if ( (sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
{
exit(1);
}
hp=gethostbyname(HOST);
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(21);
memcpy((char*)&server_addr.sin_addr,(char*)hp->h_addr,hp->h_length);
if( connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) <0 )
{
exit(1);
}
bufRecv[0] = '\0';
if ( (nRecv = recv(sockfd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
strSend = "USER " USER CRLF;
if( (nSend = send(sockfd, strSend.c_str(), strSend.length() ,0)) <0 )
{
exit(1);
}
bufRecv[0] = '\0';
if ( (nRecv = recv(sockfd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
strSend = "PASS " PASS CRLF;
if( (nSend = send(sockfd, strSend.c_str(), strSend.length() ,0)) <0 )
{
exit(1);
}
bufRecv[0] = '\0';
if ( (nRecv = recv(sockfd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
// Listen socket
if ( (listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
{
exit(1);
}
listen_namelen = sizeof(listen_name);
memset(&listen_name, 0, listen_namelen);
listen_name.sin_addr.s_addr = INADDR_ANY;
listen_name.sin_family = AF_INET;
listen_name.sin_port = 0;
if (bind(listenfd, (SA *)&listen_name, listen_namelen) < 0)
{
nRet = WSAGetLastError();
exit(1);
}
if ( (nRet = listen(listenfd, 1)) < 0)
{
exit(1);
}
getsockname(listenfd, (SA *)&listen_name, &listen_namelen);
sprintf(bufRecv, "%d,%d", ntohs( listen_name.sin_port) / 256, ntohs(listen_name.sin_port) % 256);
strSend = string("PORT 153,58,244,113,") + bufRecv + CRLF;
if( (nSend = send(sockfd, strSend.c_str(), strSend.length() ,0)) < 0 )
{
exit(1);
}
bufRecv[0] = '\0';
if ( (nRecv = recv(sockfd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
strSend = string("LIST") + CRLF;
if( (nSend = send(sockfd, strSend.c_str(), strSend.length() ,0)) < 0 )
{
exit(1);
}
bufRecv[0] = '\0';
if ( (nRecv = recv(sockfd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
data_addrlen = sizeof(data_addr);
memset(&data_addr, 0, data_addrlen);
if ( (datafd = accept(listenfd, (SA *)&data_addr, &data_addrlen)) < 0 )
{
exit(1);
}
bufRecv[0] = '\0';
if ( (nRecv = recv(datafd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
closesocket(datafd);
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
tm.tv_sec = 0;
tm.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
nRet = select(sockfd + 1, &readfds, NULL, NULL, &tm);
if ( nRet > 0)
{
if (FD_ISSET(sockfd, &readfds))
{
bufRecv[0] = '\0';
if ( (nRecv = recv(sockfd, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
exit(1);
}
bufRecv[nRecv] = '\0';
strRecv = bufRecv;
cout << strRecv;
}
}
closesocket(listenfd);
closesocket(sockfd);
WSACleanup();
return 0;
}
mymtom
2007-04-27
打赏
举报
回复
贴代码!
happyzhang
2007-04-27
打赏
举报
回复
这个问题找到原因了,关闭一个socket连接总是会处于time_wait状态一段时间,其实连接还并没有释放,这样我的程序又去马上复用这个端口,这样就挂住了。感谢mymtom() 的热心解答。
happyzhang
2007-04-26
打赏
举报
回复
我是每次数据连接之前都会发port命令的,今天又调了一天还是没有进展,好郁闷啊。
mymtom
2007-04-26
打赏
举报
回复
我很久没有写类似的程序了!你试试每次数据连接之前都发送一下PORT命令是否可以!
因为在我隐约记得很久以前用CutFTP时,每次LIST之前都有PORT!
ubuntu安装
ftp
和配置
userlist_enable设置项设置使用vs
ftp
d.user_list文件,userlist _deny设置为NO表示vs
ftp
d.usre_list文件用于设置只允许登录的用户账号,文件中未包括的用户账号被禁止
FTP
登录。PAM认证文件(此文件中file=/etc/...
重装系统后
ftp
无法与服务器连接,
ftp
连接不到服务器怎么回事
ftp
连接不到服务器怎么回事 内容精选换一换有幸能够亲自在服务器上面操作一下,这篇博客来说一说,如何在Linux上安装VNC首先要知道的是,VNC是什么。VNC(VirtualNetworkComputing),一种使用RFB协议的显示屏画面分享...
linux下C
编程
详解
linux操作系统下c语言
编程
入门整理编写:007xiong原文:Hoyt等(一)目录介绍1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux...
linux下c语言
编程
入门
(一)目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序...-线程操作 8)Linux程序设计入门--网络
编程
9)Linux下C开发工具介绍 (二)具体内容 1)Linux程
Java 网络
编程
Java语言对网络
编程
提供了良好的支持,通过其提供的接口我们可以很方便地进行网络
编程
。 二、网络
编程
基础知识 如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间能够进行相互通信是...
Linux/Unix社区
23,216
社区成员
74,539
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章