有时boost :: asio似乎在我想要之前断开连接,即在服务器正确处理断开连接之前.我不确定这是怎么可能的,因为客户端似乎认为它完全发送了消息,但是当服务器发出错误时它甚至没有读取消息头...在测试期间,这种情况可能只发生在5次中,服务器接收客户端关闭消息,并干净地断开客户端.
错误:"远程主机强行关闭现有连接"
客户端断开连接:
void disconnect()
{
boost::system::error_code error;
//just creates a simple buffer with a shutdown header
boost::uint8_t *packet = createPacket(PC_SHUTDOWN,0);
//sends it
if(!sendBlocking(socket,packet,&error))
{
//didnt get here in my tests, so its not that the write failed...
logWrite(LOG_ERROR,"server",
std::string("Error sending shutdown message.\n")
+ boost::system::system_error(error).what());
}
//actaully disconnect
socket.close();
ioService.stop();
}
bool sendBlocking(boost::asio::ip::tcp::socket &socket,
boost::uint8_t *data, boost::system::error_code* error)
{
//get the length section from the message
boost::uint16_t len = *(boost::uint16_t*)(data - 3);
//send it
asio::write(socket, asio::buffer(data-3,len+3),
asio::transfer_all(), *error); …Run Code Online (Sandbox Code Playgroud) 我有一个TCP连接.服务器只是从客户端读取数据.现在,如果连接丢失,客户端在将数据写入管道(断开的管道)时将收到错误,但服务器仍会侦听该管道.如果连接是UP还是NOT,我能找到任何方法吗?
背景
使用Xdebug与PHP和Komodo IDE以及Eclipse PDT.
Xdebug安装在服务器上并正常工作.这是确认的,因为Xdebug代码命令在插入服务器上的PHP文件时按预期工作.
问题
连接到客户端工作站不起作用,很难确定原因,因为它失败了多个IDE.
题
如果您知道Xdebug已安装并在服务器上运行,但客户端无法连接,那么请逐步检查清单.
任何人都可以帮助添加到这个以制作全面的故障排除清单吗?
具体来说,是否有任何简单的方法来确保网络流量到达客户端,并且以IDE期望查看数据的方式正确格式化?
SSH进入Web主机并尝试访问客户端:
验证客户端上基于软件的防火墙的设置
目标
目标是找到一些解决方案,其中客户端计算机上的人员至少可以确认某些东西是否到达客户端而无需确定IDE是否是问题,因为IDE是另一个可能引入问题的复杂程度.
我正在编写一个程序,向用户显示他们的IP地址,子网掩码和默认网关.我可以得到前两个,但对于最后一个,这就是我出现的:
GatewayIPAddressInformationCollection gwc =
System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses;
Run Code Online (Sandbox Code Playgroud)
当然,这会返回一个集合GatewayIPAddressInformation.因此,如果计算机有多个网关,我如何确定哪个是默认网关?
在实践中,我只看到过这个集合包含一个条目,但由于它是作为集合实现的,因此有些计算机包含多个网关,其中没有一个被标记为"默认".那么有没有办法确定默认值还是只是猜测?
在Python中,确定IP地址(例如'127.0.0.1'或'10.98.76.6')是否在专用网络上的最佳方法是什么?代码听起来不难写.但是可能会有更多的边缘情况而不是立即显而易见的,并且需要考虑IPv6支持等.是否有现有的库可以做到这一点?
当客户端使用TCP连接到服务器时,会为TCP流创建一个新套接字.连接是保留在连接的同一端口上还是更改为其他端口?
我需要列出局域网中所有连接主机的IP地址.最简单的方法是什么?
在UDP套接字上使用默认(阻塞)行为时,在这种情况下会调用sendto()块吗?我主要对Linux行为感兴趣.
对于TCP我明白,如果发送窗口已满,拥塞控制会使send()调用阻塞,但UDP呢?它有时会阻塞,还是让数据包在较低层被丢弃?
如何通过一些平均ping速率来计算互联网连接的速度.它涉及的计算是什么.可以通过ping速率计算上传/下载限制
编辑 如果ping不是解决方案还有什么?
下面,您将看到一个python程序,它充当侦听端口9999的连接请求的服务器:
# server.py
import socket
import time
# create a socket object
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# bind to the port
serversocket.bind((host, port))
# queue up to 5 requests
serversocket.listen(5)
while True:
# establish a connection
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
currentTime = time.ctime(time.time()) + "\r\n"
clientsocket.send(currentTime.encode('ascii'))
clientsocket.close()
Run Code Online (Sandbox Code Playgroud)
问题是socket.listen()方法参数(即5)的功能是什么.
基于互联网上的教程:
backlog参数指定排队连接的最大数量,并且应该至少为0; 最大值取决于系统(通常为5),最小值强制为0.
但:
tcp ×3
c# ×2
ip-address ×2
python ×2
sockets ×2
udp ×2
.net ×1
blocking ×1
boost-asio ×1
c ×1
c++ ×1
ide ×1
networking ×1
performance ×1
php ×1
ping ×1
xdebug ×1