- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
第一个:这是我在 Stackoverflow 上的第一篇文章(如果这是错误的子论坛,请告诉我,抱歉),请原谅我的写作,因为英语不是我的母语。
因此,我正在尝试使用 winsock(客户端-服务器聊天)通过 Windows 应用程序控制高速摄像头。相机通过以太网连接,它接受到给定端口的 TCP 连接。控制流作为 TCP 流套接字实现。
控制流语法:“控制流上的所有通信都是以文本 (ASCII) 格式完成的。命令的格式使得人们可以合理地键入命令并解释结果。控制流命令解释器读取命令行并重新生成响应线。对于每个命令行,只有一个响应行。接收换行符导致命令解释器尝试执行自上一个换行符以来的所有输入作为命令。生成响应(或错误)后,命令解释器返回到它的基本状态。命令行的总长度限制为 65536 字节(包括换行符)。所有响应行都保证不会超过相同的长度。”
我已经能够与摄像机建立远程登录连接并发送/接收消息。但是:我的 C++ 客户端应用程序不会接收或发送任何消息。它说连接已成功建立。
我正在使用 Windows 10 和 Visual Studio 2015;我的代码:
///////////////////////////////////////////////////////////////////////////
// TCP Client
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN
#define DEFAULT_BUFLEN 512
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <iostream>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
using namespace std;
int main()
{
int recvbuflen = DEFAULT_BUFLEN;
char sendbuf[512];
char recvbuf[DEFAULT_BUFLEN];
long rc;
WSADATA wsaData;
SOCKET sConnect = INVALID_SOCKET;
sockaddr_in serv_addr;
// ws2_32.dll activate
rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (rc == 0)
cout << "WSAStartup()\t\t successful" << endl;
else
cout << "error WSAStartup(): " << WSAGetLastError() << endl;
// socket configuration
sConnect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //AF_INET for IP4
if (sConnect != INVALID_SOCKET)
cout << "socket() \t\t successful" << endl;
else
cout << "error socket(): " << WSAGetLastError() << endl;
// connection info
serv_addr.sin_addr.s_addr = inet_addr("x.x.x.x"); //Camera IP
serv_addr.sin_family = AF_INET; //IP4
serv_addr.sin_port = htons(7200); //given Port
int conparlen = sizeof(serv_addr);
// connecting to server
rc = connect(sConnect, (struct sockaddr*)&serv_addr, conparlen);
if (rc != SOCKET_ERROR)
cout << "connect() \t\t successful" << endl;
else
cout << "not connected(): " << WSAGetLastError() << endl;
while (1)
{
//memset(&sendbuf, 0, sizeof(sendbuf)); Do I need this??
//memset(&recvbuf, 0, sizeof(recvbuf));
do {
rc = recv(sConnect, recvbuf, recvbuflen, 0);
if (rc > 0)
printf("Bytes received: %d\n", rc);
else if (rc == 0)
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
} while (rc > 0);
cout << "send: ";
cin.getline(sendbuf, 512);
//sendbuf[rc] = '\0';
rc = send(sConnect, sendbuf, (int)strlen(sendbuf), 0);
if (rc == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sConnect);
WSACleanup();
return 1;
}
printf("Bytes Sent: %ld\n", rc);
}
closesocket(sConnect);
WSACleanup();
return 0;
}
///////////////////////////////////////////////////////////////////////////
我不明白为什么它不起作用,我是不是漏掉了什么?我很感激任何建议,谢谢!
干杯芬恩
最佳答案
您的指示非常明确:服务器的响应由一行简单的文本组成,并带有尾随换行符。
您尝试从套接字读取的代码:
do {
rc = recv(sConnect, recvbuf, recvbuflen, 0);
// a few irrelevant details here
} while (rc > 0);
这将从套接字中读取。从套接字读取内容后,...它将继续读取。它会一次又一次地阅读。直到套接字关闭。当您的相机厌倦了等待您发送评论并关闭套接字连接时,recv()
最终返回 0,您的循环终止。万岁。
这显然不是你想要的。
你想从套接字中读取,直到读取到'\n'
,表示接收到整行。您必须在此处相应地调整此逻辑。
我相信您知道您也不能保证一次recv()
整行。例如,如果带有响应的整行由十个字符和后跟一个换行符组成,则第一次调用 recv()
可能会返回前五个字符,而第二次调用 recv()
将返回剩余的六个字符,其中第 6 个字符是换行符。你真的不知道宇宙射线是否导致你的相机的响应在网络上变得碎片化,你的主机以碎片数据包的形式接收来自相机的整个响应,recv()
返回每个单个数据包的有效负载,一次一个。
您将需要修复您的逻辑,以便它每次都不断地从套接字读取数据,收集数据并将其附加到缓冲区中(而不是仅仅recv()
将所有内容都放入同一个缓冲区中)缓冲区,覆盖之前的 recv()
的结果),并且仅在检查缓冲区收集的内容并找到换行符后才终止循环。
关于c++ - Winsock 客户端 - 通过 TCP/IP4 连接到网络摄像机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41183932/
有没有人在 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 进行网络编程的书籍? 我
我是一名优秀的程序员,十分优秀!