我试图通过SO_RCVTIMEO套接字选项在Ruby中使套接字超时,但它似乎对任何最近的*nix操作系统没有影响.
使用Ruby的Timeout模块不是一个选项,因为它需要为每个超时生成并加入线程,这可能会变得很昂贵.在需要低套接字超时且具有大量线程的应用程序中,它基本上会导致性能下降.许多地方都已经注意到这一点,包括Stack Overflow.
我读过迈克·佩勒姆对这个问题的优秀岗位在这里,并在努力把问题缩小到可运行代码的一个文件中创建一个TCP服务器的一个简单的例子,将收到的请求,等待在请求中发送的时间量和然后关闭连接.
客户端创建套接字,将接收超时设置为1秒,然后连接到服务器.客户端告诉服务器在5秒后关闭会话,然后等待数据.
客户端应在一秒钟后超时,但在5之后成功关闭连接.
#!/usr/bin/env ruby
require 'socket'
def timeout
sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
# Timeout set to 1 second
timeval = [1, 0].pack("l_2")
sock.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, timeval
# Connect and tell the server to wait 5 seconds
sock.connect(Socket.pack_sockaddr_in(1234, '127.0.0.1'))
sock.write("5\n")
# Wait for data to be sent back
begin
result = sock.recvfrom(1024)
puts "session closed"
rescue Errno::EAGAIN
puts "timed out!"
end
end
Thread.new do
server = TCPServer.new(nil, 1234)
while (session = server.accept) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用TCP/IP上的TLS将iOS应用程序连接到Windows C#服务器.
所述TLS连接使用不受信任的证书由一个创建不可信CA根证书使用makecert实用程序.
为了测试这些证书,我创建了一个简单的C#客户端,并使用这些证书,它能够连接并与服务器通信.
我不擅长iOS开发,但我确实找到了一些将我连接到服务器的代码,如下所示:
-(bool)CreateAndConnect:(NSString *) remoteHost withPort:(NSInteger) serverPort
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(remoteHost),
serverPort, &readStream, &writeStream);
CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel,
kCFStreamSocketSecurityLevelNegotiatedSSL);
NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL forKey:NSStreamSocketSecurityLevelKey];
// load certificate from servers exported p12 file
NSArray *certificates = [[NSArray alloc] init];
[self loadClientCertificates:certificates];
NSDictionary *sslSettings = [NSDictionary dictionaryWithObjectsAndKeys:
(id)kCFBooleanFalse, (id)kCFStreamSSLValidatesCertificateChain,
certificates,(id)kCFStreamSSLCertificates,
nil];
[inputStream setProperty:sslSettings forKey:(__bridge NSString *)kCFStreamPropertySSLSettings];
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream …Run Code Online (Sandbox Code Playgroud) 我想从a读取一行TCPStream,再写一行,然后重复.问题是BufReader::new获取我的TCPStream变量的所有权:
let stream = ...; // TCPStream
let reader = BufReader::new(stream); // moved its value
// can't use stream here anymore
Run Code Online (Sandbox Code Playgroud)
什么是简单的解决方案?
我有一个以下方法连接到程序启动时的终点
ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var remoteIpAddress = IPAddress.Parse(ChannelIp);
ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
ChannelSocket.Connect(ChannelEndPoint);
Run Code Online (Sandbox Code Playgroud)
我还有一个定时器,设置为每60秒触发一次CheckConnectivity,它会尝试将任意字节数组发送到终点,以确保连接仍然存在,如果发送失败,它将尝试重新连接.
public bool CheckConnectivity(bool isReconnect)
{
if (ChannelSocket != null)
{
var blockingState = ChannelSocket.Blocking;
try
{
var tmp = new byte[] { 0 };
ChannelSocket.Blocking = false;
ChannelSocket.Send(tmp);
}
catch (SocketException e)
{
try
{
ReconnectChannel();
}
catch (Exception ex)
{
return false;
}
}
}
else
{
ConnectivityLog.Warn(string.Format("{0}:{1} is null!", ChannelIp, ChannelPort));
return false;
}
return true;
}
private …Run Code Online (Sandbox Code Playgroud) 我使用cmd从Server机器运行RServe
Rserve.exe --RS-conf Rserv.conf --RS-port 12306
Run Code Online (Sandbox Code Playgroud)Rserv.conf文件包含以下内容:
pwdfile RserveAuth.txt
auth required
remote enable
plaintext disable
RserveAuth.txt具有以下内容:
管理员123456
我从JAVA连接到R Server
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.REngineException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.*;
public class ConnecttoR
{
...
...
public void connectR()
{
try
{
RConnection connection = new RConnection("172.16.33.242",12306); // Works if authentication is not required in Rserv.conf
}
catch (RserveException e) {
e.printStackTrace();
}
catch(REXPMismatchException e){
e.printStackTrace();
}
catch(REngineException e){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)无需用户名和密码即可连接所有人.如何添加安全性并仅允许使用有效凭据连接以访问Rserve
我最近有机会为我的项目编写一个简单的tcp-client,由于我对tcp/ip的巨大无知,我很难让它正常工作.
我发现有时候当tcp服务器关闭时连接被拒绝或者有时在调用receive时我可能会遇到异常时,我会遇到奇怪的连接问题.
由于tcp-server是一个黑盒子,我们无法访问它,我想知道在这种情况下,为此编写单元测试的最佳方法是什么?
我想要么我应该写一个tcp-server并让它返回某些输入,就像我期望从真实服务器那样,或者只是模拟与返回理想情况数据相关的函数.
我只是不喜欢这样的事实:有时我可能会遇到奇怪的连接/接收问题而且我想知道如何正确编写单元测试,我可以在将来重复使用/扩展以确保之前工作的所有内容仍然有效以防我的代码或代码发生变化.
谢谢
我需要与我的服务器建立TCP连接,该服务器具有启用SSL的端口,我需要访问该端口.
我需要发送一个XML文件并从服务器获取响应.
在启用SSL之前,我能够使用下面提到的代码从服务器获取数据.
require 'socket'
myXML = 'test_xml'
host = 'myhost.com'
port = 12482
socket = TCPSocket.open(host,port) # Connect to server
socket.send(myXML, 0)
response = socket.recvfrom(port)
puts response
socket.close
Run Code Online (Sandbox Code Playgroud)
现在我有一个'certi.pfx',我需要建立一个连接,发送my_xml数据并获得响应.如何才能做到这一点.
我还想知道我是否有'pem'和'key'文件,如何建立连接,发送my_xml数据并获得响应.
请帮忙.
我正在使用Netty 4.我看到了Netty服务器的下列选项:WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK.
官方页面相关文章链接到Norman Maurer的Netty最佳实践(带视频的幻灯片).幻灯片之一看起来像这样:
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);
Run Code Online (Sandbox Code Playgroud)
并有这个前言:
设置理智的WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK
但它是什么WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK?以及如何让他们理智?
我没有找到任何明确的信息.谢谢你的帮助.
我试图读取通过机器的缓冲区中存在的所有数据,TCP/IP但我不知道为什么我没有得到所有数据,一些数据正在错过.这是我正在使用的代码..
using (NetworkStream stream = client.GetStream())
{
byte[] data = new byte[1024];
int numBytesRead = stream.Read(data, 0, data.Length);
if (numBytesRead > 0)
{
string str= Encoding.ASCII.GetString(data, 0, numBytesRead);
}
}
Run Code Online (Sandbox Code Playgroud)
请告诉我我缺少什么来从机器获取所有数据.提前致谢..
我正在尝试做这个C#.我需要找到在我的网络中处于活动状态的所有IP地址并在列表中显示它们.我可以ping网络中所有可用的(1 ... 255)IP地址.但我想让这个过程更快.