【求教】socket连接问题(当对方拒绝访问时)..我的办法可行么?

OROCHIORI603 2010-07-22 10:55:59
如果对方服务器开启,则连接正常,如下—>

private void bt_Connect_Click(object sender, EventArgs e)
{
int port = 0;
IPAddress serverIP;
IPEndPoint serverFullAddr;

port = 123;

serverIP = IPAddress.Parse("219.126.131.83");

serverFullAddr = new IPEndPoint(serverIP,port);

socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

socket.Connect(serverFullAddr);
}

但是,有时对方服务器并没有启动,既最后一行代码提示—>由于目标机器积极拒绝,无法连接。 219.126.131.83:123

我现在的目标是—>不管对方服务器开启没开启,程序都去连接,连接失败的话也不会报错,而是每阁一段时间去尝试连接一次.

我现在的想法是->当连接失败时,触发Timer,在Timer中每隔些时间去连接一次,直到连接成功后,Timer终止.代码如下—>

private void bt_Connect_Click(object sender, EventArgs e)
{
int port = 0;
IPAddress serverIP;
IPEndPoint serverFullAddr;

port = 123;

serverIP = IPAddress.Parse("219.126.131.83");

serverFullAddr = new IPEndPoint(serverIP,port);

socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

try
{
socket.Connect(serverFullAddr);
}
catch
{
timer1.start();
}
}

private void timer1_Tick(object sender, EventArgs e)
{
int port = 0;
IPAddress serverIP;
IPEndPoint serverFullAddr;

port = 123;

serverIP = IPAddress.Parse("219.126.131.83");

serverFullAddr = new IPEndPoint(serverIP,port);

socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

try
{
socket.Connect(serverFullAddr);
}
catch
{
return;
}
timer1.stop();
}
...全文
271 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一只熊猫 2010-07-23
  • 打赏
  • 举报
回复
顶顶,是可以实现的功能。说不定还可以应用到我的项目中,呵呵。

期待高手来讨论。
小夏天~ 2010-07-23
  • 打赏
  • 举报
回复
友情帮顶。。。
满衣兄 2010-07-22
  • 打赏
  • 举报
回复
这个源代码完成的功能是当一个主机没有响应的时候,自动跳转到其他主机上,继续发生或者说是传递以前的消息,让系统以最健壮的方式运行。它适用的场景如下:1.连接第一个有效的主机 2. 如果连接失败,尝试连接其他的主机 3. 以同样的顺序发送消息 4. 如果,没有一个主机可用的话,备份消息,等到主机有效时再发送。

void OnDoWork(object sender, DoWorkEventArgs e)
{
while (_messages.Count > 0)
{
TcpClient client = new TcpClient();
try
{
client.Connect(IPAddress.Parse(_activeHost.IP), _activeHost.Port);

string message = _messages.Dequeue();

byte[] buffer = Encoding.Unicode.GetBytes(message);

client.Client.Send(buffer);

Log(new MessageEventArgs(message, _messages.Count, MessageStatus.Success, null));
}
catch (SocketException ex)
{
_hasFailures = true;
string[] messages = _messages.ToArray();
Log(new MessageEventArgs(null, _messages.Count, MessageStatus.Failure, ex.Message));

_messages.Clear();
//save array to file
StringBuilder allMessages = new StringBuilder();
foreach (string message in messages)
{
allMessages.Append(message + Environment.NewLine);
}
File.AppendAllText(_filepath, allMessages.ToString(), Encoding.UTF8);
//failover
_activeHost = FindHost();
}
finally
{
if (client.Connected)
{
client.Client.Shutdown(SocketShutdown.Both);
client.Client.Disconnect(false);
}
}
}
_backgroundWorker = null;
}


http://www.codesoso.com/code/Socket-Multi-Host.aspx

110,529

社区成员

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

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

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