c - 两台64位机器之间的TCP套接字编程

标签 c sockets

我正在尝试使用 C 中的 TCP 套接字编程实现客户端-服务器程序通信。 它介于两台安装了 linux 操作系统的 64 位机器之间。 我想在两个进程之间传输一个 c-struct。

为此,我尝试使用一个包 - unpack() 函数。

请考虑以下代码片段

/*---------------------------------------------------------
on the sending side I have: 
---------------------------------------------------------*/

struct packet {
 int64_t x;
 int64_t y;
 int64_t q[maxSize];
} __attribute__((packed));

int main(void)
{
 // build packet
 struct packet pkt;
 pkt.x = htonl(324);
 pkt.y = htonl(654);
 int i;
 for(i = 0; i< maxSize; i++){
    pkt.q[i] = i; **// I also try pkt.q[i] = htonl(i);**
 }
  // and then do the send
}

/*-----------------------------------------------------------------------------
 in the receiving side: 
 -----------------------------------------------------------------------------*/
struct packet {
 int64_t x;
 int64_t y;
 int64_t q[maxSize];
} __attribute__((packed));

static void decodePacket (uint8_t *recv_data, size_t recv_len)
{
 // checking size
 if (recv_len < sizeof(struct packet)) {
     fprintf(stderr, "received too little!");
     return;
 }

struct packet *recv_packet = (struct packet *)recv_data;

int64_t x = ntohl(recv_packet->x);
int64_t y = ntohl(recv_packet->y);
int i;
printf("Decoded: x=%"PRIu8" y=%"PRIu32"\n", x, y);

 for(i=0;i<maxSize;i++){
  **//int64_t res = ntohl(recv_packet->q[i]);  I also try to print res**          
  printf("%"PRIu32"\n" , recv_packet->q[i]);     
 }
} 

int main(int argc, char *argv[]){
 // receive the data and try to call decodePacket()
 int8_t *recv_data = (int8_t *)&buf; //buf is the data received
 size_t recv_len = sizeof(buf);
 **decode_packet(recv_data, recv_len);**  
}

//-----------------------------------------------------------------------------

现在的问题是我在结构中正确接收了 x 和 y 的值, 但是对于结构中的数组 q 我收到一个奇怪的数字,可能是一个内存抓取值,(我尝试使用 memset() 在从另一端接收数据之前用零填充数组,在这种情况下所有零的值收到)

我不明白为什么我没有收到结构中数组的正确值。

请注意 在放入结构之前,我在填充数组时尝试使用和不使用 htonl(), 另一方面:从 struct 解码数组时使用和不使用 ntohl()

任何帮助将不胜感激,

最佳答案

size_t recv_len = sizeof(buf);
decode_packet(recv_data, recv_len);

这段代码确保将错误的尺寸传递给 decode_packet .所以当decode_packet继续查看recv_len < sizeof(struct packet) ,该测试毫无意义 - 它总是会通过,无论接收到多少字节

您需要从 recv 返回的值中获取大小称呼。我最好的猜测是您收到的字节数确实少于您的预期。


虽然发送和接收结构非常方便,但通常是徒劳的。手动序列化数据或使用一些明确的机制可能是可行的方法。

关于c - 两台64位机器之间的TCP套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11850836/

相关文章:

c - 使用链表合并两个排序列表

用于探测 smtp 服务器的 Python 脚本

android - 在 recv() 函数中进行的观察,我还没有理解

javascript - socket.io 在服务器离线时发出

c++ - 在服务器上使用不同的端口号

c - 通过使套接字事件驱动使udp套接字成为非阻塞的

无法写入 68HC12 板上的 SC1DRL 寄存器——我错过了什么?

c - 递归函数 C?

c - 使用较大数组初始化字符数组时的行为

c - 线程取消问题