通过网络在c ++和c#应用程序之间进行通信

时间:2013-01-06 17:57:13

标签: c# c++ sockets tcp ip

我有一个用c#写的简单服务器在某个端口上监听。我有一个c ++应用程序,我需要应用程序将一些信息发送到服务器。此信息是包含5个整数的结构。我以为我也可以把它作为字符串发送:类似于:“ID = 3,anotherInt = 5 ......”。这是个好主意吗?如果没有,我该怎么做?

如何让它发挥作用?你的建议是什么?

谢谢。

4 个答案:

答案 0 :(得分:3)

我认为您的代码中存在错误。

char *ln = "String to send";
connect(client_socket, (struct sockaddr *)&clientService, sizeof(clientService));  
send(client_socket,(const char*)&ln, sizeof(ln), 0);

发送功能的原型是:

ssize_t send(int socket, const void *message, size_t length, int flags);

ln已经是指向char缓冲区的指针。你正在传递& ln,这是地址 指针。不应该只是“ln”吗?

答案 1 :(得分:3)

您应该在客户端代码中修复send()方法。 sizeof()是找到字符串长度的错误方法,在“ln”上应用的强制转换不太适合你需要的东西。选中<<< this link>>举个例子,看看它对你有用。 BTW,服务器中的C#代码需要一些严肃的重写,如果它可以预测的话。您正在使用4096字节缓冲区,并且无法保证对Read()的调用一次性获取整个传输。您将需要一个仅用于Read的循环以确保您正在阅读所需的一切 - 当然,这需要明确定义通信语义。网络快乐!

答案 2 :(得分:2)

首先,(const char*)&ln不正确。 lnchar *,因此当您使用&获取地址时,您将获得char **,然后您将其转换为char *。这是未定义的行为。你想要摆脱&运营商。此外,您可能希望了解指针是什么以及如何使用它们。

根据经验,不要肆意妄为使编译器闭嘴。错误试图告诉你一些事情。但是,sockaddrsockaddr_in是正确的; api就是这样设计的。如果在编译器选项中打开-Wall,它应该在正确的位置给你一个警告。

另外:您想要strlen(ln)而不是sizeof

快速指针上的Dnd Rundown

当类型在变量名称前包含*时,该变量包含指向该类型值的指针。指针很像C#中的引用,它是,包含某些数据的位置。当函数想要查看调用者拥有的一段数据时,通常会将这些函数传递给函数,有时是因为它想要修改它。字符串表示为char *,它是指向字符串中第一个字符的指针。与指针相关的两个运算符是&*&接受左值并返回指向该值的指针。 *接受一个指针并返回它指向的值。在这种情况下,您有一个字符串,char *,并且您调用的函数需要char *,因此您可以直接传递它而无需转换或使用*或{ {1}}。但是,对于其他功能,您有一个&且它需要struct sockaddr_in,因此您(正确)使用struct sockaddr *获取&,然后将其转换为{ {1}}。这被称为“类型双关语”,并且是API的令人不快的现实。谷歌会给你一个比我更好的类型惩罚的描述。

答案 3 :(得分:0)

connect(client_socket, (struct sockaddr *)&clientService, sizeof(clientService));

这没关系,但这一行应该是:

send(client_socket,(const char*)ln, strlen(ln), 0);

可以省略转换(const char*)。 在你的代码中,指针ln的值被发送(正确)但你很可能想要发送它指向它的整个长度的字符串。

关于要发送的消息:将整数转换为ascii并不是一个坏主意。您还可以查看JSON或Googles protobuf格式。格式化程序或解析器可以从头开始编写。

相关问题