这个问题是关于解决SslPolicyError.RemoteCertificateNotAvailable错误的。
我开发了一个带有 SSLStream 的 TCP 服务器和另一端的 TCP 客户端。
我使用以下方式验证服务器:
sslStream.BeginAuthenticateAsServer
Run Code Online (Sandbox Code Playgroud)
我通过以下方式对客户端进行身份验证:
sslStream.BeginAuthenticateAsClient
Run Code Online (Sandbox Code Playgroud)
我正在从 加载我的客户端证书Trusted Publishers - Local Machine。
两者都在同一台机器上运行。
我尝试从 .cer 和 .pfx 文件加载客户端证书,而不是从受信任的发布者存储中加载客户端证书。但是服务器的客户端(远程)证书验证器回调因发现SslPolicyErrors错误而失败RemoteCertificateNotAvailable。
[如你所见,我不明白一个TCP服务器和客户端的基本概念非常好,大概socket.emit甚至是不可能的,但我想知道的最佳替代品或类似的事情...]
Socket.io有一个发送事件并在另一侧捕获它们的美妙事物,它在它的第一页(http://socket.io).我可以使用NodeJS的常规'net'模块做类似的事吗?如果不是那么相同的是什么?
我试过了:
server.js
var server = net.createServer(function(socket) {
socket.on("connect",function() {
socket.emit('test',{msg : 'did you get it ?'});
});
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
client.js
var client = net.createConnection(8000, localhost);
client.on('connect',function(){
client.on('test',function(data) {
console.log(data.toString());
});
});
Run Code Online (Sandbox Code Playgroud)
但是你可以想象,它不起作用.我怎样才能做到这一点?
提前致谢.
在以下通用场景中:
System.Net.Sockets.TcpClient TC = SomeHowObtained;
System.Net.Sockets.NetworkStream NS = TC.GetStream();
Run Code Online (Sandbox Code Playgroud)
据我所知,有3次超时:
NS.ReadTimeout // 1
TC.SendTimeout // 2
TC.ReceiveTimeout // 3
NS.WriteTimeout // 4
Run Code Online (Sandbox Code Playgroud)
在行为意义上是(1)=(3)和(2)=(4)?文档没有给出提示.
我想知道如何列出系统上使用 Java 打开的所有 TCP 连接。我正在使用 CentOS。
我也不知道从哪里开始。任何指针都会有所帮助。
提前致谢
感谢您的提示,我必须做这样的事情
Q) 为当前正在侦听的所有 tcp 端口识别任何新建立的连接,
并继续每 5 秒轮询一次。当不再有任何已建立的连接时,脚本应终止。
public class TCPConnections {
public HashSet<Integer> establishedConnections = new HashSet<Integer>();
public HashSet<Integer> listeningConnections = new HashSet<Integer>();
public static void main(String[] args) {
// TODO Auto-generated method stub
TCPConnections tcpConnections = new TCPConnections();
try{
do{
tcpConnections.getListeningConnections();
Thread.sleep(5000);
tcpConnections.getEstablishedConnections();
}while(!tcpConnections.establishedConnections.isEmpty());
}
catch(Exception ex){
ex.printStackTrace();
}
}
public void getEstablishedConnections(){
String netstat = new String();
try {
String line;
establishedConnections = new HashSet<Integer>();
String[] cmd = { …Run Code Online (Sandbox Code Playgroud) type
TForm8 = class(TForm)
idtcpclnt1: TIdTCPClient;
idtcpsrvr1: TIdTCPServer;
procedure FormCreate(Sender: TObject);
procedure idtcpsrvr1Execute(AContext: TIdContext);
procedure idtcpclnt1Disconnected(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form8: TForm8;
implementation
{$R *.dfm}
procedure TForm8.FormCreate(Sender: TObject);
begin
idtcpclnt1.Connect;
end;
procedure TForm8.idtcpsrvr1Execute(AContext: TIdContext);
begin
AContext.Connection.Disconnect(true); //this gets called
end;
procedure TForm8.idtcpclnt1Disconnected(Sender: TObject);
begin
ShowMessage('true'); //but this does not
end;
Run Code Online (Sandbox Code Playgroud)
OnDC永远不会得到处理.为什么?
好吧这有点令人尴尬,但我只是有一个相当"noob"的问题.
在客户端服务器TCP通信中,我的系统是访问远程服务器的客户端,例如端口XX,客户端是否在其系统中打开一个随机端口YY以与远程端口XX通信?所以当我们编码时,我们确实指定了目标端口XX吗?
对于客户端,在创建套接字时选择端口YY本身,不是吗?
无论如何我可以监控/限制/控制任何客户端与特定服务器通信吗?(比如说客户在特定服务端口与服务器通信?)
是否存在任何IPTABLE规则或某些限制客户端的防火墙规则?可以这样做吗?
目标端口是否保存在套接字结构中?如果是这样的话?
谢谢!
TCP服务器每8ms连续发送一次数据帧.我想编写一个能够接收这些数据帧的客户端.在Indy 9中是否有任何程序知道缓冲区中是否有可用的数据?
我目前的程序如下(我使用的是Thread):
procedure TThreadRead.Execute;
var
buffer: array [0..755] of byte;
//s1: string;
//i: integer;
begin
IdTCPClient1.RecvBufferSize:= 756;
IdTCPClient1.Connect;
while Terminated = false do
begin
if IdTCPClient1.InputBuffer.Size = 0 then
IdTCPClient1.ReadFromStack(True,0,False);
while IdTCPClient1.InputBuffer.Size > 0 do
begin
ReadBuffer(buffer, FClient.InputBuffer.Size);
//s1:= '';
//For i:=0 To Length(buffer)-1 Do
// s1:=s1+IntToHex(Ord(buffer[i]),2); //Read values-->global var
//Form1.Memo1.Text:=s1;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有没有更有效的解决方案连续读取TCP数据(如UDP中的onread事件)?
提前致谢.
我正在使用C++ TCP/IP套接字.根据我的要求,我的客户端必须连接到服务器并读取它发送的消息(这是真的很新,不是吗)但是...在我的应用程序中我必须等待一段时间(通常是1到2小时)在我真正开始阅读消息之前(通过recv()或read()),服务器仍然继续发送消息.
我想知道缓冲区的容量是否有限制,以防止这些消息被读取以及它们的物理内存用于缓冲这些消息?发件人或收件人?
我有一个通过套接字进行通信的客户端和服务器。我像这样设置它们:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
...
Run Code Online (Sandbox Code Playgroud)
客户端联系服务器,服务器发送响应(在我的测试用例中为2906字节):
n = write(newsockfd, msgout,strlen(msgout));
if (n < 0){
printf("Unable to send reponse.\n");
}else{
printf("Response sent.\n");
}
Run Code Online (Sandbox Code Playgroud)
客户端读取如下响应:
n = read(sockfd,buffer,sizeof(buffer));
if (n < 0){
printf("Socket error.\n");
}else{
printf("%d bytes read.\n", n);
}
Run Code Online (Sandbox Code Playgroud)
缓冲区的大小约为10000个字节。现在经常发生这种情况(占所有情况的25%-75%的时间),只有1448字节到达客户端。没有比这更多的数字或1448。您如何处理这种数据丢失情况,为什么会发生?TCP / IP不能确保没有数据丢失吗?由于错误率很高,因此套接字连接对我几乎没有用。即使我先将邮件的大小发送给客户端。谁保证此消息会到达?如果确实如此,那么我仍然需要一遍又一遍地重新发送主要消息。
我只是用更大的字符串(14538)字节再次尝试了一下,在所有情况下100%仅到达5792字节。所以我猜我的代码中有一个编程错误。但是我看不到。
这是我的测试案例(Linux):
客户:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
int main(int argc, char *argv[]){
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
int …Run Code Online (Sandbox Code Playgroud) 请原谅我对任务和异步的知识不足。
使用TcpClient类,我正在与可用服务器建立连接:
void async RunClientAsync()
{
TcpClient client = new TcpClient();
try
{
await client.ConnectAsync(IPAddress.Parse("1.1.1.1"), 8889);
Task.Start(() => ReadClientAsync(client));
}
catch (Exception ex)
{
HandleException(ex);
}
}
// -----
void async ReadClientAsync(TcpClient client)
{
byte[] bf = new byte[2048];
try
{
while(true)
{
int br = await client.NetworkStream().ReadAsync();
if (br > 0)
{
HandleInboundData(bf, br);
}
}
}
catch (Exception ex)
{
HandleException(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
辅助方法HandleException(Exception ex)和HandleInboundData(byte [] buffer,int length)将执行假定的任务。
与服务器的连接将是永久的,并且从服务器接收的数据的长度和频率将是未知的,其想法是将任务丢在那里,仅在数据可用时才接收和处理入站数据。
ReadClientAsync(TcpClient client)显然是失败的,因为如果没有可用数据,ReadAsync将始终返回0字节。
我应该如何使用异步/任务来编写ReadClientAsync来防止出现繁忙循环的情况?我以前在这些情况下使用BeginRead / EndRead,效果很好。在这种特殊情况下,这将是解决方案吗?
谢谢,