- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要按照确定的顺序从客户端向服务器发送数据,服务器也可以按客户端发送的相同顺序接收这些数据。在下面的代码中,存在一个问题,即像下一个数据的数据一样接收数据(即控制字节 1 )。
前任:
在客户端上,我有以下几条发送 1 ( Connection._Input
)
if SendInt(Sock, Ord(Connection._Input)) <= 0 then
Exit;
Check
变量上接收的,而在
dwC
上接收的。
program _Client;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
WinSock,
SysUtils;
type
Connection = (Desktop, _Input);
const
SendBuf: array [0 .. 9] of AnsiChar = ('A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', #0);
function SendInt(S: TSocket; I: Integer): Integer;
begin
Result := send(S, I, SizeOf(I), 0);
end;
function ConnectServer: TSocket;
var
Wsa: WSAData;
Client: sockaddr_in;
S: TSocket;
Rslt: Integer;
begin
S := INVALID_SOCKET;
try
Rslt := WSAStartup(MakeWord(2, 2), Wsa);
if Rslt = NO_ERROR then
begin
S := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if S <> INVALID_SOCKET then
begin
Client.sin_family := AF_INET;
Client.sin_addr.s_addr := inet_addr('192.168.15.6');
Client.sin_port := htons(5099);
if connect(S, Client, SizeOf(Client)) <> SOCKET_ERROR then
Writeln('Connected successfully!');
end;
end;
except
Writeln(SysErrorMessage(WSAGetLastError));
end;
Result := S;
end;
function DesktopThread(P: Pointer): DWORD; stdcall;
var
Sock: TSocket;
dwC, dwD, dwE, dwF, dwG: DWORD;
A, B: Integer;
begin
Result := 0;
Sock := ConnectServer;
if send(Sock, SendBuf, SizeOf(SendBuf), 0) <= 0 then
Exit;
if SendInt(Sock, Ord(Connection.Desktop)) <= 0 then
Exit;
dwC := 111;
dwD := 222;
dwE := 333;
dwF := 444;
dwG := 555;
repeat
if recv(Sock, A, SizeOf(A), 0) <= 0 then
Exit;
if recv(Sock, B, SizeOf(B), 0) <= 0 then
Exit;
if SendInt(Sock, Ord(Connection._Input)) <= 0 then
Exit;
if SendInt(Sock, dwC) <= 0 then
Exit;
if SendInt(Sock, dwD) <= 0 then
Exit;
if SendInt(Sock, dwE) <= 0 then
Exit;
if SendInt(Sock, dwF) <= 0 then
Exit;
if SendInt(Sock, dwG) <= 0 then
Exit;
// Writeln(Format('%s', [SysErrorMessage(WSAGetLastError)]));
Writeln(Format('dwC: %d, dwD: %d, dwE: %d, dwF: %d, dwG: %d',
[dwC, dwD, dwE, dwF, dwG]));
until True;
end;
var
ThrId: Cardinal;
begin
try
CreateThread(nil, 0, @DesktopThread, nil, 0, ThrId);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
program _Server;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
WinSock,
SysUtils;
type
Connection = (Desktop, Input, _End);
const
Buffer: array [0 .. 9] of AnsiChar = ('A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', #0);
function SendInt(S: TSocket; I: Integer): Integer;
begin
Result := send(S, I, SizeOf(I), 0);
end;
function ClientThread(P: Pointer): DWORD; stdcall;
var
Buf: array [0 .. SizeOf(Buffer) - 1] of AnsiChar;
Sock: TSocket;
Check: BOOL;
A, B: Integer;
_connection: Connection;
dwC, dwD, dwE, dwF, dwG: DWORD;
begin
Result := 0;
Sock := TSocket(P);
if recv(Sock, Buf, SizeOf(Buffer), 0) <= 0 then
begin
closesocket(Sock);
Result := 0;
Exit;
end;
if not CompareMem(@Buf, @Buffer, SizeOf(Buffer)) then
begin
closesocket(Sock);
Result := 0;
Exit;
end;
if recv(Sock, _connection, SizeOf(_connection), 0) <= 0 then
begin
closesocket(Sock);
Result := 0;
Exit;
end;
if _connection = Connection.Desktop then
begin
A := 666;
B := 777;
repeat
if SendInt(Sock, A) <= 0 then
Exit;
if SendInt(Sock, B) <= 0 then
Exit;
if recv(Sock, Check, SizeOf(Check), 0) <= 0 then
Exit;
Writeln(BoolToStr(Check));
{ if not Check then
continue; }
if recv(Sock, dwC, SizeOf(dwC), 0) <= 0 then
Exit;
if recv(Sock, dwD, SizeOf(dwD), 0) <= 0 then
Exit;
if recv(Sock, dwE, SizeOf(dwE), 0) <= 0 then
Exit;
if recv(Sock, dwF, SizeOf(dwF), 0) <= 0 then
Exit;
if recv(Sock, dwG, SizeOf(dwG), 0) <= 0 then
Exit;
// Writeln(Format('%s', [SysErrorMessage(WSAGetLastError)]));
Writeln(Format('dwC: %d, dwD: %d, dwE: %d, dwF: %d, dwG: %d',
[dwC, dwD, dwE, dwF, dwG]));
until True;
end;
end;
function StartServer(Port: Integer): Boolean;
var
_wsdata: WSAData;
serverSocket, S: TSocket;
_addrIn, _addr: sockaddr_in;
addrSize: Integer;
tid: Cardinal;
begin
Result := False;
if WSAStartup(MakeWord(2, 2), _wsdata) <> 0 then
Exit;
serverSocket := socket(AF_INET, SOCK_STREAM, 0);
if serverSocket = INVALID_SOCKET then
Exit;
_addrIn.sin_family := AF_INET;
_addrIn.sin_addr.S_addr := INADDR_ANY;
_addrIn.sin_port := htons(Port);
if bind(serverSocket, _addrIn, SizeOf(_addrIn)) = SOCKET_ERROR then
Exit;
if listen(serverSocket, SOMAXCONN) = SOCKET_ERROR then
Exit;
addrSize := SizeOf(_addrIn);
getsockname(serverSocket, _addrIn, addrSize);
Writeln(Format('Listening on port %d.' + #13, [ntohs(_addrIn.sin_port)]));
while True do
begin
S := accept(serverSocket, @_addr, @addrSize);
CreateThread(nil, 0, @ClientThread, Pointer(S), 0, tid);
end;
Result := True;
end;
begin
try
if not StartServer(5099) then
Writeln(SysErrorMessage(WSAGetLastError));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
最佳答案
您在客户端与服务器中的数据大小未对齐。
type
Connection = (Desktop, _Input);
byte
。这本身是可以的,但是您在客户端和服务器中对它们的处理方式不同。
SendInt()
函数从客户端发送该函数,该函数将转换为整数。
SizeOf(_connection)
接收,它只是一个字节。由于字节顺序,
1
保留在缓冲区中,以后再读入
dwC
。
Minimum enum size
设置为
doubleword
或作为字节发送来纠正错误。
SendInt(Sock, Ord(Connection._Input))
var
Check: BOOL;
....
recv(Sock, Check, SizeOf(Check), 0) ,
Writeln(BoolToStr(Check));
Value of B Value of UseBoolStrs Value of returned string
true false '-1'
关于sockets - WinSock:服务器未按客户端发送的相同顺序接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55896318/
有没有人在 Windows 上使用 Winsock(不是 MSMQ)级别的 PGM 的经验?它看起来像是一个有用的可靠多播协议(protocol)(la TIBCO Rendezvous),我认为如果
我在 VS 2008 下使用 Winsock。 我有一个线程专门用于通过阻塞调用accept() 来接受传入的TCP 连接请求。当我的应用程序需要关闭时,我需要以某种方式解锁该线程,以便它可以执行关闭
在 KB4338830 更新后一段时间后,我们的应用程序突然持续卡住。不幸的是,应用程序无法重新启动也无法关闭,我怀疑这一切都是因为我正在使用的winsock(刚刚移植)。它是在vb.net上编写的,
我正在使用 Winsock API(不是 CAsyncSocket)来创建一个监听传入连接的套接字。 当有人尝试连接时,如何在接受连接之前获取他们的 IP 地址?我试图让它只接受来自某些 IP 地址的
服务质量 (QoS) 旨在管理带宽使用,这隐含地假设应用程序竞争该(有限)资源。这些天来,对于任何应用程序来说,这真的是一个问题吗? 它还假设 QoS 协议(protocol)和 Internet 协
我的项目使用 windows.h,其中使用了 winsock.h,我需要包含使用 winsock2 的 boost:assio。所以我收到很多错误,说 Winsock.h 已经包含在内。我可以定义 W
使用典型的 irc 客户端,我可以输入: /server localhost 6667 nick:pass 当我输入为 ZNC 配置的 nick:pass(IRC 保镖)时,我将被转发到在我的服务器/
我正在研究我面临的问题之一,与提出的问题类似 here .该问题基本上解决了客户端应用程序无法连接到数据库的问题。该解决方案似乎表明安装了与网络协议(protocol)不兼容的应用程序,我们应该卸载该
我一直在挠头,几个小时以来一直在寻找这个问题的答案。基本上我所做的就是打开一个到其他机器的套接字并从中读取数据。然后,通过传递表示套接字的 int 的 fdopen 调用,将该套接字“转换”为文件句柄
我在我的 VB6 应用程序中使用 winsock,这是我的代码: Private Sub Form_Load() With Winsock1 .Close .RemoteHo
我需要按照确定的顺序从客户端向服务器发送数据,服务器也可以按客户端发送的相同顺序接收这些数据。在下面的代码中,存在一个问题,即像下一个数据的数据一样接收数据(即控制字节 1 )。 前任: 在客户端上,
我正在开发客户端-服务器 Winsock 应用程序 (Visual C++),它应该通过网络传输各种数据(视频流、音频流、服务通知等)。我知道更简洁的方法是为每个单独的数据类型在单独的线程上使用单独的
我正在使用Microsoft Windows WinSock API拧小型HTTP服务器。 处理多个用户时是否需要应用多线程逻辑? 当前,Windows会在发生网络事件时发送一条消息,并且每条消息 (
对于我的项目,我无法调试程序,所以我无法确定为什么会出现此错误。 我的托管在 c# 上的服务器无法连接到本地主机上的服务器。 它没有向我的服务器发回“连接”信号,它永远不会连接,我认为代码写得很好,我
如何让 Winsock 程序只接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略,而不是得到 TCP 拒绝。 最佳答案 要使 Winsock 程序仅接受来自特定 IP 地址的连接,请使用 WSA
我写了一个数据包拦截器来转储来自winsock的send/recv函数的信息,据我所知,这两个函数都位于ws2_32.dll中;该钩子(Hook)是通过向一个函数写入一个 jmp 来完成的,该函数记录
我有一个简单的 winsock 程序,我想通过系统代理传递我的连接。我看到一些帖子解释了如何捕获系统代理然后发送如下字符串: CONNECT 127.0.0.1:8080 HTTP/1.0\r\n 等
我正在使用 tcp 套接字在 Windows XP 上的两个应用程序之间提供进程间通信。由于各种原因,我选择了 tcp 套接字。我看到平均往返时间为 2.8 毫秒。这比我预期的要慢得多。分析似乎表明延
我正在尝试在 Windows 下移植这个简单的 TCP echo 程序 ( https://github.com/mafintosh/echo-servers.c/blob/master/tcp-ec
过去两周我一直在学习 C,设法了解指针、数组和结构。 我想在 Windows 上进行一些套接字编程,想知道是否有人有任何提供教程和示例的网站,或者推荐一些使用 winsock 进行网络编程的书籍? 我
我是一名优秀的程序员,十分优秀!