我没有看到太多的用处TCPClient,但有很多Socket?它们之间的主要区别是什么?您何时使用它们?
我知道.NET Socket是在WINSOCK之上编写的,并且TCPClient是Socket类的包装器.因此TCPClient,链条上行,可能效率低下.如果我错了,请纠正我.
当使用HttpURLConnection时,如果我们不"获取"并使用它,则需要关闭InputStream吗?
即这样安全吗?
HttpURLConnection conn = (HttpURLConnection) uri.getURI().toURL().openConnection();
conn.connect();
// check for content type I don't care about
if (conn.getContentType.equals("image/gif") return;
// get stream and read from it
InputStream is = conn.getInputStream();
try {
// read from is
} finally {
is.close();
}
Run Code Online (Sandbox Code Playgroud)
其次,在完全读取所有内容之前关闭InputStream是否安全?
是否存在将底层套接字置于ESTABLISHED或甚至CLOSE_WAIT状态的风险?
我发现一个正在运行的进程,其中PID 26376侦听端口9001和9002,就像我尝试运行我的程序(作为服务)绑定到它失败的端口一样.
但是当我尝试使用taskkill/PID杀死它时,它表示找不到进程26376.类似地,当我尝试在任务管理器中找到"显示所有用户的进程"时,我无法在任何地方找到它.
有谁能解释一下?这是一个已经不存在的僵尸程序吗?我怀疑侦听该端口的进程是我程序运行的先前实例,但是可能导致这种情况的原因是什么?
编辑:Sysinternals TCPView显示该进程不存在.Sysinternals Process Explorer不显示该过程.任务列表不显示该过程.

我想知道TCP中bind()的确切功能.将本地地址"绑定"到套接字是什么意思?如果它正在为套接字分配端口号,那么为什么我们不在客户端中使用它?我知道端口是由操作系统在客户端自动分配的,但我并没有全面了解所有这些是如何工作的.
在bind()之后,我们监听().绑定是如何与listen()相关的?listen()是否知道bind()已被执行?如果是这样,bind()会做出哪些更改以便知道它?我的意思是,为成功执行返回零如何帮助?
我已经经历了很多定义,但没有在哪里可以详细了解所有这些.所以,如果有人能够向我解释这一点,我将不胜感激.
我想在我的应用程序中调用一个Web服务,我可以在导入WSDL时使用它,或者只使用带有URL和参数的"HTTP GET",所以我更喜欢后者,因为它很简单.
我知道我可以使用indy idhttp.get来完成这项工作,但这很简单,我不想在我的应用程序中添加复杂的indy代码.
更新:抱歉,如果我不清楚,我的意思是"不要添加复杂的indy代码",我不想为这个简单的任务添加indy组件,并且更喜欢更轻松的方式.
我需要一个快速的方法来确定一个给定的端口是否用Ruby打开.我目前正在摆弄这个:
require 'socket'
def is_port_open?(ip, port)
begin
TCPSocket.new(ip, port)
rescue Errno::ECONNREFUSED
return false
end
return true
end
Run Code Online (Sandbox Code Playgroud)
如果端口是打开的,它的效果很好,但是它的缺点是它偶尔会坐下等待10-20秒然后最终超时,抛出ETIMEOUT异常(如果端口关闭).我的问题是:
可以将此代码修改为仅等待一秒钟(false如果我们当时没有得到任何回报,则返回)或者是否有更好的方法来检查给定端口上的给定端口是否打开?
编辑:只要它跨平台工作(例如,Mac OS X,*nix和Cygwin),调用bash代码也是可以接受的,尽管我更喜欢Ruby代码.
我的游戏服务器上的这些错误越来越频繁.它们导致服务器继续关闭并重新启动......
System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine
at System.Net.Sockets.Socket.BeginSend(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
at iRP.Game.Sessions.Session.SendData(Byte[] Data)
Run Code Online (Sandbox Code Playgroud)
这是生成这些错误的代码:
public void SendData(byte[] Data)
{
try
{
if (mSocket == null)
{
//Output.WriteLine("[SND] Socket has a null exception, which means it is now invalid. Remove this socket!", OutputLevel.CriticalError);
}
else
{
mSocket.BeginSend(Data, 0, Data.Length, SocketFlags.None, sendCallback, mSocket);
}
}
catch (Exception e)
{
string WhatToWrite = "Error handled …Run Code Online (Sandbox Code Playgroud) 我知道sockaddr_in用于IPv4,sockaddr_in6用于IPv6.我的困惑是sockaddr和sockaddr_in之间的区别[6].
有些函数接受sockaddr,有些函数接受sockaddr_in或sockaddr_in6,所以:
而且因为sizeof(sockaddr_in6) > sizeof(sockaddr) == sizeof(sockaddr_in).
一个例子是:我们有一个套接字,我们想得到它的字符串IP地址(它可以是ipv4或ipv6).
我们首先打电话getsockname来获得一个addr然后inet_ntop基于的电话addr.sa_family.
这段代码片段有什么问题吗?
char ipStr[256];
sockaddr_in6 addr_inv6;
sockaddr* addr = (sockaddr*)&addr_inv6;
sockaddr_in* addr_in = (sockaddr_in*)&addr_inv6;
socklen_t len = sizeof(addr_inv6);
getsockname(_socket, addr, &len);
if (addr->sa_family == AF_INET6) {
inet_ntop(addr_inv6.sin6_family, &addr_inv6.sin6_addr, ipStr, sizeof(ipStr));
// <<<<<<<<IS THIS LINE VALID, getsockname expected a sockaddr, but we use
// it output parameter as sockaddr_in6.
} else {
inet_ntop(addr_in->sin_family, &addr_in->sin_addr, …Run Code Online (Sandbox Code Playgroud) 我打开一个TCP套接字并将其连接到网络上其他位置的另一个套接字.然后,我可以成功发送和接收数据.我有一个计时器,每秒钟向套接字发送一些东西.
然后,我通过强行断开连接(在这种情况下拉出以太网电缆)粗暴地中断连接.我的套接字仍然报告它每秒都成功写出数据.这持续大约1小时30分钟,最终给出写入错误.
什么指定套接字最终接受另一端的超时消失了?它是操作系统(Ubuntu 11.04),它来自TCP/IP规范,还是套接字配置选项?
"零拷贝网络"和"内核旁路"有什么区别?它们是两个含义相同或不同的短语吗?内核绕过"零复制网络"中使用的技术,这是关系吗?
linux networking operating-system network-programming zero-copy