我有一个简单的C#服务器在某个端口上监听。我有一个C++应用程序,需要向服务器发送一些信息。这些信息是一个包含5个整数的结构体。我在考虑将其作为字符串发送:类似于“ID=3,anotherInt=5……”。这是一个好主意吗?如果不是,我该怎么做?
如何让它工作?您有什么建议?
谢谢。
如何让它工作?您有什么建议?
谢谢。
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”吗?
(const char*)&ln
是不正确的。 ln
是一个 char *
,因此当你使用 &
获取它的地址时,你得到的是一个 char **
,然后将其转换为 char *
。这是未定义的行为。你需要摆脱 &
运算符。此外, 你可能需要了解指针是什么以及如何使用它们。sockaddr
和 sockaddr_in
的内容是正确的;这个API就是设计成这样的。如果您在编译器选项中打开-Wall
,它应该会在正确的位置给你警告。strlen(ln)
而不是sizeof
。*
时,该变量保存该类型的值的指针。指针类似于C#中的引用,它是一个持有某些数据位置的值。当函数想要查看调用者拥有的一些数据时,通常会将这些指针传递到函数中,有时是因为它想要修改它。字符串表示为char *
,它是指向字符串中第一个字符的指针。与指针相关的两个运算符是&
和*
。 &
接受一个lvalue并返回该值的指针。 *
接受一个指针并返回其指向的值。在这种情况下,你有一个字符串,作为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);
在您的代码中,指针ln的值被正确地发送了,但您很可能想要发送它所指向的字符串的整个长度,因此可以省略转换(const char*)
。
关于要发送的消息:将整数转换为ASCII并不是一个坏主意。您还可以查看JSON或Google的protobuf格式。可以轻松地从头开始编写格式化程序或解析器。