- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个源(摄像机)将通知(运动警报)发送到我为其预订IP的服务器的端口8085。也许在这样的谈判中,我不能称其为“服务器”,但这是我们的服务器提供其他一些服务。
我已经编写了两个程序来接收和回传当前的运动状态,目前仅在屏幕上。接收到的数据包是XML形状的,我可以解析它并找到所需的信息。为了进行测试,我只提取标记为UtcTime的时间。另一台计算机使用Onvif设备管理器订阅了同一台摄像机,因此我可以检查是否错过了一些“时间”。这些程序之一在GoLang中,而一个在C++中。前者按预期工作,而后者则不然。也许这(C++)是我在套接字编程方面的第一次经验。在C++中,我没有使用任何其他库,并且我使用了传统的套接字编程方法,也不需要在客户现场使用任何其他库。问题在于,ODM会回荡新的时间(或说通知消息)以及GoLang代码,而C++代码会停留在accept函数(accepting ... message)上。我给你们两个人调查。
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
)
func count() (f func() int) {
var counter int
f = func() int {
counter++
return counter
}
return
}
func main() {
http.HandleFunc("/", Server)
http.ListenAndServe(":8085", nil)
}
func Server(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Fatal(err)
}
str := string(body)
for {
index := strings.Index(str, "UtcTime")
if index == -1 {
break
}
part := str[index+20 : index+28]
fmt.Printf("%s\n", part)
str = str[index+28:]
}
}
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string>
#define DBG printf("%s:%d\n", __FILE__, __LINE__)
#define DIE die(__FILE__, __LINE__)
void die(const char *file, int line)
{
printf("%s:%d: %s\n", file, line, strerror(errno));
exit(1);
}
std::string extractTime(const char *utc)
{
char buf[80];
memcpy(buf, utc + 11, 8);
buf[9] = 0;
return buf;
}
int main()
{
printf("creating socket...\n");
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
DIE;
int reuseaddr = 1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)) == -1)
DIE;
printf("binding...\n");
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8085);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, (sockaddr *)&addr, sizeof(addr)) == -1)
DIE;
printf("listening...\n");
if (listen(sock, SOMAXCONN) == -1)
DIE;
socklen_t size = sizeof(addr);
while (true)
{
printf("accepting...\n");
int new_sock = accept(sock, 0, 0);
if (new_sock < 0)
DIE;
const int buf_size = 80;
char buf[buf_size * 2 + 1];
memset(buf, 0, buf_size);
int read_size;
std::string time;
while (true)
{
memcpy(buf, buf + buf_size, buf_size);
read_size = recv(new_sock, buf + buf_size, buf_size, 0);
if (read_size < 0)
DIE;
buf[buf_size + read_size] = 0;
char *p = strstr(buf, "UtcTime");
if (p && (p - buf < buf_size))
{
char buf2[80];
char *p2 = strstr(p + 9, "\"");
if (p2)
{
memcpy(buf2, p + 9, p2 - p - 9);
buf2[p2 - p - 9] = 0;
time = extractTime(buf2);
printf("%s\n", time.c_str());
}
}
if (strstr(buf, "</SOAP-ENV:Envelope>"))
break;
}
}
return 0;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string>
#define DBG printf("%s:%d\n", __FILE__, __LINE__)
#define DIE die(__FILE__, __LINE__)
void die(const char *file, int line)
{
printf("%s:%d: %s\n", file, line, strerror(errno));
exit(1);
}
std::string extractTime(const char *utc)
{
char buf[80];
memcpy(buf, utc + 11, 8);
buf[9] = 0;
return buf;
}
void receive(int s2)
{
const int buf_size = 80;
char buf[buf_size * 2 + 1];
memset(buf, 0, sizeof(buf));
int read_size;
std::string time;
FILE *fp = fopen("dump.bin", "ab");
if (!fp)
DIE;
while (true)
{
memcpy(buf, buf + buf_size, buf_size);
read_size = recv(s2, buf + buf_size, buf_size, 0);
if (read_size < 0)
DIE;
if (read_size == 0)
break;
if (fwrite(buf + buf_size, buf_size, 1, fp) != 1)
DIE;
buf[buf_size + read_size] = 0;
//printf("%d bytes received: '%s'\n", read_size, buf + buf_size);
char *p = strstr(buf, "UtcTime");
if (p && (p - buf < buf_size))
{
char buf2[80];
char *p2 = strstr(p + 9, "\"");
if (p2)
{
memcpy(buf2, p + 9, p2 - p - 9);
buf2[p2 - p - 9] = 0;
time = extractTime(buf2);
printf("%s\n", time.c_str());
}
}
if (read_size < buf_size)
break;
}
fclose(fp);
close(s2);
}
int main()
{
printf("creating socket...\n");
int s1 = socket(AF_INET, SOCK_STREAM, 0);
if (s1 == -1)
DIE;
int reuseaddr = 1;
if (setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)) == -1)
DIE;
printf("binding...\n");
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8085);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(s1, (sockaddr *)&addr, sizeof(addr)) == -1)
DIE;
printf("listening...\n");
if (listen(s1, 0) == -1)
DIE;
socklen_t size = sizeof(addr);
while (true)
{
printf("accepting...\n");
int s2 = accept(s1, 0, 0);
if (s2 < 0)
DIE;
int pid = fork();
if (pid == 0)
{
receive(s2);
break;
}
}
return 0;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace tcplistener
{
class Program
{
static void Main(string[] args)
{
const int port = 8081;
TcpListener tcpListener = new TcpListener(IPAddress.Any, port);
tcpListener.Start();
while (true)
{
Socket socketConnection = tcpListener.AcceptSocket();
var buf = new byte[80000];
var size = socketConnection.Receive(buf);
Console.WriteLine("{0} bytes received", size);
Console.WriteLine("{0}", Encoding.UTF8.GetString(buf, 0, size).Substring(0, 80));
socketConnection.Disconnect(true);
}
}
}
}
2919 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
5395 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
7871 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
13408 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
16503 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
18979 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
21455 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
23931 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
26407 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
28883 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
31359 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33835 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
43739 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
45260 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
36500 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
45260 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
42340 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
33580 bytes received
POST /behnama-subscription HTTP/1.1
Host: 192.168.14.127:8081
SOAPAction: http
最佳答案
您的C++变体有一些有趣的缺陷:
buf_size
的前80个(buf
)字符,然后从未初始化的后80个字符(第一个memcpy
)中读取。 memcpy
从缓冲区的后半部分开始到第一个字节的80个字节,而不管缓冲区中实际上有多少个有用/已初始化的字节(两个字节)。 accept
,以获得连接的套接字,然后读取直到错误并退出。这会破坏侦听套接字,而其余连接不被接受。如果得到EOF(read_size
为0),则您将永久旋转(可能)而不退出,因为以后的每个read
也会返回0。"UtcTime"
,则您将搜索一个双引号,该双引号会在9个字节后开始,即使"UtcTime"
距离缓冲区末尾少于9个字节也是如此。 accept
以等待其他套接字。 (使用Go编写代码非常容易,因为Go具有内置的所有正确的东西。)
关于c++ - 接收数据包发送后,等待功能等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59663534/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!