簡體   English   中英

通過C中的套接字發送結構

[英]Sending a structure through a socket in c

我想通過用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;
};

提前致謝。

對於相同的機器和編譯器,您可以執行以下操作:

// 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

您可以將消息寫在套接字上:

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

然后在客戶端讀回。 如果始終使用相同的硬件/編譯器,則該方法有效,因為該結構將以相同的方式進行編譯。 如果您沒有整個mymess的memset(),則write()中可能有未初始化的內容。 它應該是安全的,但可以引發健全性檢查。

為了獲得更可靠的消息傳遞,您需要設計或采用序列化協議。 JSON是一種非常流行的(盡管可能不在C程序員中),但是還有很多其他的。

在編寫結構之前,您需要了解填充問題。 看來您的結構已經很好地對齊了。 但是,接收器必須具有相似的體系結構和相似的編譯器結構打包設置,才能以完全相同的方式使用該結構。 另外,您可以定義一個消息協議,該協議顯式打包此數據並以字節流的形式寫入。

也就是說,仍然可以通過執行write(sock,&myMessage,sizeof(message))來簡單地編寫結構。 它將寫出sizeof(message)的所有字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM