Socket接受数据的问题

linguanyu315 2011-01-10 10:57:06
要实现在接受数据超时后, 自动进行下一次接收尝试. 我在下面程序中尝试设置
client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);
或者client.ReceiveTimeout = 2000;
但是结果都不正确. 超时后, 连接就被关闭了.

请大家指点.

client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);
client.ReceiveTimeout = 2000;
while(true)
{
data = new byte[1024];
recv = client.Receive(data);
if (recv == 0)
break;

Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
client.Send(data, recv, SocketFlags.None);
}
...全文
101 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
linguanyu315 2011-01-10
  • 打赏
  • 举报
回复
我在代码中设置了发送和接收超时, 结果不时所期待的. 连接还是在超时后关闭.

我期待的结果就象C++中一样

do
{
received = socket_read(pWtls, RXbuffer, sizeof(RXbuffer), TIMEOUT_MILLISECONDS, &readError);
}
while ( readError == 2201 );//2201是超时代码, 只要超时就自动开始下一个接收尝试.

C#中的代码: 请指教怎么改进实现c++中的功能,可以在while(true)中自动开始下个接收.
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,
2200);

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

newsock.Bind(ipep);
newsock.Listen(10);
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);
client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 2000);

IPEndPoint clientep =
(IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}",
clientep.Address, clientep.Port);


string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);
client.Send(data, data.Length,
SocketFlags.None);
while(true)
{
data = new byte[1024];
recv = client.Receive(data);
if (recv == 0)
break;

Console.WriteLine(
Encoding.ASCII.GetString(data, 0, recv));
client.Send(data, recv, SocketFlags.None);
}
wuyq11 2011-01-10
  • 打赏
  • 举报
回复
影响该ReceiveTimeout同步调用,它没有任何影响
异步调用。
设置超时时间:
socket = new Socket(hostEP.Address.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 3000);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

111,096

社区成员

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

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

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