【发布时间】:2009-06-18 03:41:37
【问题描述】:
SOCKET client = accept(listen_sock, 0, 0);
timeval client_to;
client_to.tv_sec = 1;
client_to.tv_usec = 0;
setsockopt(client, SOL_SOCKET, SO_RCVTIMEO, (char*)&client_to, sizeof(client_to));
char buffer[1024];
while ((ret = recv(client, buffer, 1024, 0)) != 0)
{
cout << "<in loop>" << endl;
if (ret == -1 && WSAGetLastError() != WSAETIMEDOUT) break;
if (ret > 0) cout << std::string(buffer, 0, ret) << endl;
}
closesocket(client);
以上代码是用 C++ 编写的简单回显服务器的一部分。 我面临的问题是......
- 如何设置超时值并检测超时时间是否过期?
- 如何检测socket断开连接?
请让我用 C# 显示一些代码。谢谢。
添加>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我的部分 C# 代码如下...
try
{
// Read all
spider.Client.ReceiveTimeout = 500; // spider is TcpClient type and blocking socket.
int readCount = 0;
SocketError socketError;
while ((readCount = spider.Client.Receive(tempBuffer, 0, tempBuffer.Length, SocketFlags.None, out socketError)) > 0) // I think time-out does not work, Receive() returns immediately.
{
recvBuffer.Append(tempBuffer, 0, readCount);
}
}
catch (Exception e) // even though spider is disconnect, no exception occurred. how can I detect disconnection?
{
Console.WriteLine("Exception: {0}", e.Message);
}
【问题讨论】:
-
所以你的问题更多的是“为我写这个”而不是“请帮助写这个”? :) 我建议尝试一下,当您遇到实际的 C# 相关问题时再回来。 .NET 有一个 Socket 类,它的工作方式与任何其他套接字非常相似,只是它是一个类而不是函数和句柄。
-
我的文章是不是显得不真诚?我已经使用 C# 进行了多次测试,但找不到正确的方法。我不只是问而不做。我知道 C# 的套接字是相似的(我真的希望如此),但要让它像我预期的那样工作并不容易。还是谢谢。
-
没问题,但是您能否发布您当前的 C# 代码以便我们可以使用它?它使每个人都更容易,因为现在您似乎有两个不同的问题,也许将它们分成两个不同的问题会更好。
标签: c# c++ networking sockets