Socket有些时候接收不到消息,紧急求救中

lansluo 2006-11-01 09:03:25
一个C/S模式的socket应用,服务器端采用c#编写。当客户端调用的时候,服务器端偶尔会获取不到客户端发送的信息,并且是再也收不到该客户端发送的信息,直到这个客户端重新绑定一个新socket来连接。这个问题在一台客户端或者多台客户端同时保持连接时都会出现。

关键代码如下:
IPEndPoint localEndPoint = new IPEndPoint(ipAddress,Convert.ToInt32(port_));
Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
listener.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,50);
listener.Bind(localEndPoint);
listener.Listen(400);
Socket s = listener.Accept();
while(s!=null)
{
MsgOperate o=new MsgOperate(this);
o.ClientSocket=s;
Thread clientservice = new Thread(new ThreadStart(o.Poll));
clientservice.Start();
s=listener.Accept();
}
}
catch(Exception ex)
{
//错误抛出(此处没有抛出过错误)
}

public class MsgOperate
{
public void Poll(){
while(true)
{
if(clientsocket.Poll(-1,SelectMode.SelectRead))
{
//如果引发消息监听的socket已关闭,则退出循环
int k = ServiceClient();
if (k == 0)
break;
}
}
}
public int ServiceClient()
{
while(true)
{
try
{
if(socket.Available==0)
{ returnvalue=0;
break;
}
else
{returnvalue=1;
//做消息处理
}
return returnvalue;
}
catch(Exception e)
{
return 0;
}
}
}
...全文
1171 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lansluo 2006-11-01
  • 打赏
  • 举报
回复
顶顶顶
lansluo 2006-11-01
  • 打赏
  • 举报
回复
to tjvictor:如果是这样,不能解释2台客户端连接主机.一台客户端始终没问题,另外一台经常出现问题的情况吧.


个人认为是if(clientsocket.Poll(-1,SelectMode.SelectRead))这个判断没有通过。可是不知道该如何解决,用单步调试,调试不到这个地方
lansluo 2006-11-01
  • 打赏
  • 举报
回复
to gxy2005.如果几千次出现一次,可以这样解决,如果出现次数多的话,这样解决怕是不行的,尤其有一些消息远远大于8K
灰太狼 2006-11-01
  • 打赏
  • 举报
回复
可能是你的緩沖區的問題,以前我把server和client放到一台主機上運行時,就會遇到偶爾收不到的情況。你可以用tcpListen和tcpClient來試試,他們都是繼承自socket的。
GXY2005 2006-11-01
  • 打赏
  • 举报
回复
你這樣,發送消息侯接收到發回確認,沒有確認消息重新發送!偶爾丟失,重新發送!
listme 2006-11-01
  • 打赏
  • 举报
回复
帮定
lansluo 2006-11-01
  • 打赏
  • 举报
回复
顶,兄弟姐妹急救啊
lansluo 2006-11-01
  • 打赏
  • 举报
回复
upup


help help
lansluo 2006-11-01
  • 打赏
  • 举报
回复
不管效率吧,开发语言不是我能选择的。我不会C。


有人懂吗?或者给我一个思路也好啊
  • 打赏
  • 举报
回复
我以前曾经在项目中比较过,当客户端数据越多,则无论是效率还是运行稳定性都比C有明显的差距。
  • 打赏
  • 举报
回复
服务端的SOCKET程序一般都不用C#写,效率太低。
lansluo 2006-11-01
  • 打赏
  • 举报
回复
whChina,有msn吗?能和你直接交流吗?
江城老温 2006-11-01
  • 打赏
  • 举报
回复
看了下,你的代码里获取的socket连接没有保存过。没有断线重新连接。

应该在主程序里还开了一个线程吧。这样的话,可能是多线程的问题。阻塞

若没开其他线程的话,你怎么轮询多个client?
flowersea312 2006-11-01
  • 打赏
  • 举报
回复
帮顶了
lansluo 2006-11-01
  • 打赏
  • 举报
回复
to:whChina 为什么要放在循环外面?我试过把while(s!= null)改成while(true),应该和放在循环外面一个效果吧。还是有这个问题。
江城老温 2006-11-01
  • 打赏
  • 举报
回复
Thread clientservice = new Thread(new ThreadStart(o.Poll));

把线程打开的地方放在程序循环外面。试试。

lansluo 2006-11-01
  • 打赏
  • 举报
回复
你的文章写的很好,可是不是我要的。

谁来救救我,突然接收不倒消息,重启socket又可以正常通讯。用sniffer监视,发现机器是收到消息的,但是程序的listen没有listen到
yes4pierce 2006-11-01
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Pierce/category/22231.html
www_123du_com 2006-11-01
  • 打赏
  • 举报
回复
用心跳消息来保证Socket的正常连接。

心跳消息:
由客户端每隔一段时间(如3秒)发送一个简单的特定的消息,如果超过一定的时间(如5秒)没有收到响应消息,则放弃此Socket,重新连接。(因此客户端需要一个timer)
而服务器只需要在收到心跳消息后回一个心跳响应消息。
jameszhang82 2006-11-01
  • 打赏
  • 举报
回复
必须在一定的间隔发送数据,以保持连接
加载更多回复(7)

110,539

社区成员

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

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

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