【问题标题】:transferring data over socket in C在 C 中通过套接字传输数据
【发布时间】:2019-07-09 13:15:31
【问题描述】:

我有一个通过 Internet 套接字 (UDP) 传输数据的程序。所以定义了 char 数组作为数据包。例如。 char packet1[] = 11(标头[2 位])+192.168.100.158(发件人_IP[15 位])+006(TTL [3 位])+...(11192.168.100.158006...)。接收端根据数组的索引提取数据(如0-1为header,2-16为sender_IP)。

我的问题是,当我将 sender_IP 定义为 [2-16] 并且 IP 地址短于 15 位(例如 192.168.100.5)时,接收方会错误地提取数据。我的问题是,即使 IP 地址是 15 位或 14 位(不添加额外字符来定义 sender_IP 的字符串长度),如何确保正确提取 sender_IP?

我正在考虑创建一个结构类型并定义类似 `

struct packet {
   char header[1];
   char senderIP[15]
   , TTL[2];
  };

。但我不知道在这一行sendto(s, buf, BUFSIZE, 0,(struct sockaddr *) &si_other, slen) 上写什么而不是buf,因为我知道buf 需要是字符。我需要 ASCII 表示的 IP 地址作为发送一些数据到sender_IP 地址(inet_aton(sender_IP, &si_other.sin_addr)。

【问题讨论】:

  • 1) 用空格填充它。 2) 终止它?
  • 顺便说一句,buf 不必是 char*,它可以是指向结构或任何其他类型的指针,但由于差异和平台和编译器之间的打包和字节序。

标签: c arrays sockets udp


【解决方案1】:

将 IP 作为 32 位整数发送,或将字符串用零打包,使其长度合适,例如192.168.100.005.

【讨论】:

  • 还有网络字节序的问题。 ascii 避免了这种情况。
  • 是的。如果要通过套接字发送整数,则需要使用 htonl() 和 ntohl()。
【解决方案2】:

使用 limit-group-char 像 = "!!!"或“xxx”并检测它以知道从哪里开始检测

【讨论】:

    【解决方案3】:

    有一种方法可以将它复制到一个本地结构中,该结构多一个字节来为额外添加的 NUL 字节腾出位置。

    struct packet *in;
    struct cooked_packet {
       char header[1];
       char sender_ip[1+ sizeof in->ip];
       char ttl[2];
       } this;
    
    this.header = in.header;
    strncpy(this.ip, in->ip, sizeof in->ip);
    this->ip [ sizeof this.ip -1] = 0;
    memcpy(this.ttl, ip->ttl, 2);
    

    更新:这是 strncpy() 可能有用的少数几个地方之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      相关资源
      最近更新 更多