通过c

时间:2017-12-06 00:05:20

标签: c sockets data-structures tcp structure

我想通过用C编写的tcp服务器/客户端程序中的套接字发送数据结构。但是当我尝试打印发送的数据时,它不会打印任何内容。我现在已经意识到以这种方式发送结构是一个坏主意,我所看到的帖子在找到真正实现这项工作的方法方面并不是很有帮助。这是有问题的数据结构:

#define BUFFSIZE 1024
#define USERLEN 32
#define OPTLEN 16

struct  message{
  char option[OPTLEN];
  char user[USERLEN];
  char buff[BUFFSIZE]; 
  char target[USERLEN];
  int sockid;
};

提前感谢。

3 个答案:

答案 0 :(得分:2)

对于相同的机器和编译器,您可以执行以下操作:

// define your structure:
#define BUFFSIZE 1024
#define USERLEN 32
#define OPTLEN 16

typedef struct message{
  char option[OPTLEN];
  char user[USERLEN];
  char buff[BUFFSIZE]; 
  char target[USERLEN];
  int sockid;
}my_message;


// now you can use it in your program

my_message m;

// initialize m
...
strcpy(m.user,"1234");
...
m.sockid = sockfd;

// send it over 

if ((nbytes = write(sockfd, &m, sizeof(my_message)) != sizeof(my_message))
{
  printf("error writing my message");
}



// read the message on the other side:
...
my_message received_message;
int size;

if( (size = recv ( sockfd, (void*)&received_message, sizeof(my_message), 0)) >= 0)
{
     // check the size
}

// It would work for same machines 32/64 bits and same compilers.

如果您需要更好的可移植性,请尝试protobuf-cnanopb,二进制序列化binntpl

答案 1 :(得分:1)

你可以在套接字上写出消息:

struct message mymess;
...
write(socketfd, &mymess, sizeof(struct message));

然后在客户端读回来。如果它始终是相同的硬件/编译器,那将起作用,因为结构将以相同的方式编译。如果你没有memset()整个mymess,那么你很可能在write()中有未初始化的东西。它应该是安全的,但可以引起健全性检查。

要获得更可靠的消息传递,您需要设计或采用序列化协议。 JSON是一个非常受欢迎的(虽然可能不是C程序员),但还有很多其他的。

答案 2 :(得分:0)

在编写结构之前,您需要了解填充问题。您的结构似乎很好地对齐。但是,接收器需要采用类似的体系结构和类似的编译器结构打包设置才能以相同的方式使用结构。或者,您可以定义一个消息协议,该协议显式打包此数据并作为字节流写入。

那就是说,一个结构仍然可以简单地写成 写(袜子,& myMessage,sizeof(消息))。它将写出sizeof(消息)的所有字节。