TCP 连接建立后 如果没有数据发送,多长时间会断开

yjsfi 2010-01-28 05:33:20
我做了一个 socket 5 代理客户端代码如下

//设置代理服务器地址和端口
TcpClient client = new TcpClient();
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("124.248.33.21"), 1080);

client.Connect(ipPoint);

//第一步握手协议 Socket5 版本为5 需要验证
Socket5Client.sock5req1 req1= new Socket5Client.sock5req1();
req1.Ver = 5;
req1.nMethods = 1;
req1.Methods = 2;

SocketUtils.Send(client.Client, new byte[] { req1.Ver, req1.nMethods, req1.Methods });


//第一步握手协议服务器的应答
byte[] bufferAns1=new byte[2];
SocketUtils.Receive(client.Client, 2, out bufferAns1);

Socket5Client.sock5ans1 ans1 = new Socket5Client.sock5ans1();
ans1.Ver = bufferAns1[0];
ans1.Method = bufferAns1[1];


//Method为2时间,验证用户名密码
string userName = "test";
string passWord = "test";

if (ans1.Method == 2)
{
SocketUtils.Send(client.Client, new byte[] { (byte)passWord.Length, (byte)userName.Length });
}

byte[] userNameByte = ASCIIEncoding.ASCII.GetBytes(userName);
byte[] passWordByte = ASCIIEncoding.ASCII.GetBytes(passWord);
byte[] passWordLength = new byte[] { (byte)passWord .Length};

byte[] userNameAndPassWord= new byte[userNameByte.Length+passWordByte.Length+1];
userNameByte.CopyTo(userNameAndPassWord,0);
passWordLength.CopyTo(userNameAndPassWord, userNameByte.Length);
passWordByte.CopyTo(userNameAndPassWord,userNameByte.Length+1);

SocketUtils.Send(client.Client, userNameAndPassWord);

//获取验证结果bufferValidateUser[1]为0时验证通过
byte[] bufferValidateUser = new byte[2];
SocketUtils.Receive(client.Client, 2, out bufferValidateUser);


//通过代理服务器发送格式
IPEndPoint destIP = new IPEndPoint(IPAddress.Parse("124.248.33.21"), 1234);
string str ="通过代理客户端发上来的,哈哈哈!~~";
UnicodeEncoding unicode=new UnicodeEncoding();
byte[] msgBuffer= unicode.GetBytes(str);

byte[] data = new byte[10 + msgBuffer.Length];
data[0] = 5; data[1] = 1; data[2] = 0; data[3] = 1;//前4个字节
Array.Copy(destIP.Address.GetAddressBytes(), 0, data, 4, 4); //IP地址
Array.Copy(BitConverter.GetBytes(
IPAddress.HostToNetworkOrder(destIP.Port)), 2, data, 8, 2); //端口号

Array.Copy(msgBuffer, 0,data, 10, msgBuffer.Length);
SocketUtils.Send(client.Client, data);

byte[] sock5ans2 = new byte[6];
SocketUtils.Receive(client.Client, 6, out sock5ans2);

string str1 = "第二条,哈哈哈!~~";
byte[] msgBuffer1 = unicode.GetBytes(str1);
SocketUtils.Send(client.Client, msgBuffer1);

for (int i = 0; i < 100; i++)
{
string str2 = "再一条"+i.ToString();
System.Threading.Thread.Sleep(1000);
byte[] msgBuffer2 = unicode.GetBytes(str2);
SocketUtils.Send(client.Client, msgBuffer2);
}

就是最后这几句
for (int i = 0; i < 100; i++)
{
string str2 = "再一条"+i.ToString();
System.Threading.Thread.Sleep(1000);
byte[] msgBuffer2 = unicode.GetBytes(str2);
SocketUtils.Send(client.Client, msgBuffer2);
}
循环的时候能发上去头几条 输出结果为:“通过代理客户端发上来的,哈哈哈!~~第二条,哈哈哈!~~再一条0再一条1再一条2”
而不是循环到100这是什么问题??纳闷中 。。。
...全文
3307 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
all 牛人
ztenv 2010-02-03
  • 打赏
  • 举报
回复
默认好像是4秒还是五秒,不过你可以设置socket的keepalive为true,这样即使没有数据,tcp/ip的底层也会保持连接,虽然tcp/ip的规则不建议这样做;
yjsfi 2010-02-02
  • 打赏
  • 举报
回复
我发现我问的方向错了,我当时是以为是TCP连接空闲时间过长导致的,原来发现是代理服务器指向的目标服务收到字符串后直接执行sockect.close()了,可能是服务器忙闲的原因,有时候收到的多,有时候少!一个客户端,一个socket5代理服务,一个真正服务把我给搞晕了!希望这个帖子能改成socket流量限制的讨论了,暂不结贴
freewind0521 2010-02-01
  • 打赏
  • 举报
回复
没做过,up
yjsfi 2010-01-28
  • 打赏
  • 举报
回复
回头又实验了下如果把 最后那个循环的 System.Threading.Thread.Sleep(1000);时间改短为 50毫秒
结果为:通过代理客户端发上来的,哈哈
再一条4再一条5再一条6再一条
14再一条15再一条16再一条17再
24再一条25再一条26再一条27
能循环到 27

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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