写入和读取,在C中插入AF_UNIX

时间:2013-05-12 12:10:42

标签: c sockets system-calls

我在C中编写了一些套接字函数,但是我遇到了这个问题。 我有一个包含三个字段的结构:

typedef struct {
  char type;           
  unsigned int length; 
  char *buffer;        
} message_t;

我需要包装相同的字符串(类型,长度,缓冲区)并以原子方式将其写入套接字。之后使用read函数我需要读取消息并在同一结构中插入三个字段。我不明白如何在固定长度的字符串中转换int。

2 个答案:

答案 0 :(得分:1)

这是一个想法,虽然我没有测试过,但我使用的非常相似。

Fisrt你需要在两边打包结构:

#pragma pack(1)
typedef struct {
   char type;
   unsigned int length;
   char *buffer;
} message_t;

要发送数据包,请使用以下函数:

void SendData(char type, unsigned int length, char *data) {
   message_t packet;

   packet.type = type;
   // convert the int to network byte order
   packet.length = htonl(length);

   // Here we have two options to send the packet:
   // 1 with malloc and one send
       packet.buffer = malloc(length);
       memcpy(packet.buffer, data, length);
       length +=sizeof(char);
       length +=sizeof(int);
       // send it in one shut
       send(mySocket, (const char *)&packet, length, 0);
       // release the memory
       free(packet.buffer);

   // 2 without malloc and two sends:
       send(mySocket, (const char *)&packet, sizeof(char)+sizeof(int), 0);
       send(mySocket, data, length, 0);
}

要读取另一侧的数据,请使用以下内容:

BOOL RecvData(message_t *packet) {
   // NOTE: 
   // if packet.buffer is not NULL, the caller of this function must 
   // release the memory allocate here
   packet->buffer = NULL;

   // at the receiver, you need 2 reads:
   // 1 to know how many bytes to read
   // 2 to read those bytes.
   if (recv(mySocket, (char *)packet, sizeof(char)+sizeof(int), 0) > 0)
   {
       // convert the int to host byte order
       packet->length = ntohl(packet->length);
       packet->buffer=malloc(packet->length);
       // if we got the memory, go ahead
       if (packet->buffer != null)
       {
           if (recv(mySocket, packet->buffer, packet->length, 0) == packet->length)
               return TRUE;
       }
   }
   return FALSE;
}

答案 1 :(得分:0)

使用memcpy将您的结构复制到一个void内存块中,该块可以解释为字符串或您喜欢的任何内容将其发送到您的远程进程,将其转换为本地结构,您的值应该按照您希望的方式进行恢复。 e.g

message_t my_msg;
char out_buf[MAX_LEN] = {0,};

memcpy(out_buf, my_msg, sizeof(message_t));

send_it_over_socket(out_buf);