socket连接成功后 第一次发送成功 对方接收不到 第二次发送成功后却可以

yzk2008 2011-01-17 01:54:28
我用C#开发一个通讯中间件(客户端),在socket连接成功后总是第一次发送成功,对方接收不到,而第二次发送却可以接收到,对方接收成功后,就会断开连接,客户端重新连接,然后第一次发送成功,对方同样接收不到,第二次成功,周而复始。。。。各位大虾有没有碰到这种问题?帮忙解决。。
...全文
650 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzk2008 2011-01-22
  • 打赏
  • 举报
回复
上面那个问题已经找到了,是发送的报文格式不对,对方没解析就丢掉了。。。

可是,又发现一个问题:就是客户端程序断掉连接或退出程序,然后再重开程序或重新连接后,服务端发送过来的信息客户端死活收不到。
yzk2008 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 linux7985 的回复:]
我觉的像这种问题,代码出在服务器端的概率很大
[/Quote]
服务器程序是别公司开发的。。。
烈火蜓蜻 2011-01-18
  • 打赏
  • 举报
回复
我觉的像这种问题,代码出在服务器端的概率很大
zlkingdom 2011-01-18
  • 打赏
  • 举报
回复
这种事情要把服务器程序和客户端程序放在一起联调才能看出问题啊,只看一边找问题有点难...
yzk2008 2011-01-17
  • 打赏
  • 举报
回复
InitConnection()方法初始化socket和连接

SendRpt()绑定一个定时器,读取dtTxSend(DataTable对像)里面的数据并发送出去。
yzk2008 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 adsdassadfasdfasdf 的回复:]
没看代码 怎么知道

你当我们是神马啊!
[/Quote]

呵呵,各位大虾,不好意思,本人公司有点很贱,上个鸟网还得跑个老大远。。
yzk2008 2011-01-17
  • 打赏
  • 举报
回复
/// <summary>
/// 初始化Socket通讯
/// </summary>
private void InitConnection()
{
try
{
//得到参数配置
sport = int.Parse(Common.Common.ServerPort);
host = Common.Common.ServerIP;

//把ip和端口转化为IPEndPoint实例
ip = IPAddress.Parse(host);
ipe = new IPEndPoint(ip, sport);


//创建一个Socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipe);
ShowText("连接服务端成功...");
}
catch (SocketException ex)
{
ShowText("连接服务端失败...");
Logger.Write(this.Name + "{tab}InitClient{tab}连接服务端失败," + ex.Message, "local");
}
}

private void SendRpt()
{
try
{
lock (dtTxSend)
{
//如果连接断开,则重连
if (socket.Connected == false)
{
lock (socket)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipe);
}
}
foreach (DataRow dr in dtTxSend.Rows)
{
//如果为重发信息,则重发
if (dr["STATUS"].ToString() == "1")
{
//如果当前时间与上次发送时间之差大于所设重发时间,则重发
DateTime SendTime = DateTime.Parse(dr["SENDTIME"].ToString());
TimeSpan ts = DateTime.Now - SendTime;
if (ts.TotalMilliseconds >= ReSendTime)
{
byte[] bs = (byte[])dr["RECORD"];
socket.Send(bs, bs.Length, 0);

//发送成功后,将SENDTIME置为当前时间
dr["SENDTIME"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string strmsg = "";
strmsg = "send:重发成功,消息类型:" + dr["MESSAGETYPE"] + ",流水号:" + dr["SENDSN"];
txtMessage.Invoke(new setText(ShowText), new object[] { strmsg });
break;
}
}
}

}
}
catch (ArgumentNullException ex1)
{
txtMessage.Invoke(new setText(ShowText), new object[] { "重发送报文失败:" + ex1.Message });
Logger.Write(this.Name + "{tab}SendRpt{tab}重发送报文失败," + ex1.Message, "local");
}
catch (SocketException ex2)
{
//if (!ex2.Message.Contains("远程主机强迫关闭了一个现有的连接"))
//{
txtMessage.Invoke(new setText(ShowText), new object[] { "重发送报文失败:" + ex2.Message });
//}
Logger.Write(this.Name + "{tab}SendRpt{tab}重发送报文失败," + ex2.Message, "local");
}
一克代码 2011-01-17
  • 打赏
  • 举报
回复
没看代码 怎么知道

你当我们是神马啊!
烈火蜓蜻 2011-01-17
  • 打赏
  • 举报
回复
明显是你的代码有问题,不贴出来没有办法帮你哦
l576981437 2011-01-17
  • 打赏
  • 举报
回复

代码贴出
yzk2008 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
这要看你具体的代码了,可能第一次接收会在发送之前就已经结束,比如非阻塞模式
[/Quote]
如果是你说的这种情况,就会是整个过程的第一次才接收不到,不会这样有规律了吧?
bdmh 2011-01-17
  • 打赏
  • 举报
回复
这要看你具体的代码了,可能第一次接收会在发送之前就已经结束,比如非阻塞模式

111,119

社区成员

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

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

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