c++和c#应用程序之间通过网络进行通信
Communication between c++ and c# application through network
我有一个用c#编写的简单服务器在某些端口上监听。我有一个应用程序在c++和我需要的应用程序发送一些信息到服务器。该信息是一个包含5个整数的结构体。我在想,我可以发送它也作为一个字符串:类似:"ID=3,另一个int =5…"。这是个好主意吗?如果没有,我该怎么做呢?
如何让它工作?你的建议是什么?
谢谢。
我想你的代码有错误。
char *ln = "String to send";
connect(client_socket, (struct sockaddr *)&clientService, sizeof(clientService));
send(client_socket,(const char*)&ln, sizeof(ln), 0);
send函数的原型是:
ssize_t send(int socket, const void *message, size_t length, int flags);
ln已经是一个指向字符缓冲区的指针。你正穿过&ln,这是地址指针的。不应该只写"ln"吗?
您应该在客户端代码中修复send()方法。Sizeof()是查找字符串长度的错误方法,在"ln"上应用的强制类型转换并不完全适合您的需要。查看<<这个链接>>查看示例,看看它是如何为您工作的。顺便说一句,如果服务器中的c#代码能够正常工作,那么它需要重新编写。您正在使用4096字节的缓冲区,并且对Read()的调用不能保证一次获取整个传输。你将需要一个循环来确保你正在阅读你需要的所有内容——当然,这需要一个清晰的通信语义定义。网络快乐!
首先,(const char*)&ln
不正确。ln
是一个char *
,所以当你使用&
取它的地址时,你得到一个char **
,然后你将其转换为char *
。这是未定义的行为。您需要去掉&
操作符。此外,您可能还需要了解指针是什么以及如何使用它们。
作为经验法则,不要随意地强制转换以使编译器停止工作。这些误差试图告诉你一些东西。然而,sockaddr
和sockaddr_in
的事情是正确的;API就是这样设计的。如果你在编译器选项中打开-Wall
,它会在正确的位置给你一个警告。
ALSO:你想要strlen(ln)
而不是sizeof
。
指针简写
当一个类型在变量名前包含*
时,该变量保存着指向该类型值的指针。指针很像c#中的引用,它是一个值,保存一些数据的位置。当函数想要查看调用者拥有的一段数据时(有时是因为想要修改它),通常会将这些参数传递给函数。字符串表示为char *
,它是指向字符串中第一个字符的指针。与指针相关的两个操作符是&
和*
。&
接受左值并返回指向该值的指针。*
接受一个指针并返回它所指向的值。在这种情况下,您有一个字符串,作为char *
,并且您调用的函数需要char *
,因此您可以直接传递它,而无需强制转换或使用*
或&
。然而,对于另一个函数,您有一个struct sockaddr_in
,它想要一个struct sockaddr *
,所以您(正确地)使用&
来获得struct sockaddr_in *
,然后将其转换为struct sockaddr *
。这被称为"类型双关语",这是API令人不快的现实。谷歌会给你一个比我更好的双关语描述。
connect(client_socket, (struct sockaddr *)&clientService, sizeof(clientService));
这是可以的,但是这一行应该是:
send(client_socket,(const char*)ln, strlen(ln), 0);
,其中转换(const char*)
可以省略。在你的代码中,指针ln的值被发送(正确),但你更可能想要发送它所指向的字符串的整个长度。
关于要发送的消息:将整数转换为ascii不是一个坏主意。你也可以看看JSON或者google的protobuf格式。格式化器或解析器可以很容易地从头编写。
- 我的神经网络不起作用 [XOR 问题]
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 通过网络、跨平台传递std::变体是否安全
- 如何在MNIST上提高网络运行的准确性
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 混淆了如何使用IDL与Ethovision进行通信
- C++ Boost::asio串行通信与Arduino无法写入
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 使用Boost.ASIO与服务器进行简单的网络tcp通信
- 定义网络通信的结构
- 通过网络在应用程序之间进行通信
- 用c++实现TCP/Ip网络通信
- Qt TCP/IP通信只能在本地工作,但在网络中会丢失
- Qt和Node JS通过WebSockets进行网络通信
- PLC和网络通信:概念基础
- 用于通过网络在应用程序之间进行通信的协议/基础结构
- c++和c#应用程序之间通过网络进行通信