两次发送和recv不工作C.

时间:2016-09-02 17:09:34

标签: c sockets networking send recv

我遇到了一个我无法解决的问题所以我重新启动了。 我遇到了数据封装问题,或者更具体,没有封装。所以在我发现之后,封装很有用,我开始重写代码。

现在我遇到了另一个问题。不知何故,我的发送和接收电话不能正常工作。

以下是我发送的部分:

char to_send[] = "hello. I am the Data.";

  // get size of data
  int len = strlen(to_send);
  char slen[len];
  sprintf(slen,"%d",len);
  printf("%s\n",slen);
  // send size of data
  if(send(comm_fd,slen,len,0)<0){perror("Error on send"); exit(1);}

  // send data
  if(send(comm_fd,to_send,len,0)<0){perror("Error on send"); exit(1);}

这里是我回忆的部分:

// getting size of bytes to recv
  char buf[1000];
  bzero(buf,1000);

  int rec = recv(comm_fd, buf, 100,0);
  printf("rec\n: %i",rec);
  printf("buf\n: %s\n", buf);

  int buffsize;
  buffsize = atoi(buf);
  bzero(buf,1000);
  printf("buffsize: %i\n",buffsize);

  // recv the bytes
  bzero(buf,1000);
  rec = recv(comm_fd, buf, buffsize,0);
  printf("rec\n: %i",rec);
  printf("%s",buf);

所以我现在的问题是:我可以收回下一个数据的大小并打印出来。但数据本身并未出现。

有人能帮助我吗?我认为我做错了很重要(我是C和网络编程的新手)

提前致谢

1 个答案:

答案 0 :(得分:3)

第一次send来电的两件事:

if(send(comm_fd,slen,len,0)<0){perror("Error on send"); exit(1);}

您在此处发送len个字节数,但len的长度为to_send,而不是slen的长度。您很可能会从slen的初始化部分之外发送数据,从而导致未定义的行为

第二个问题是您将to_send的长度作为可变长度字符串发送,因此收到的信息实际上并不知道要接收多少。在您的情况下,您实际上(并且可能会)在单个recv调用中接收字符串的长度。至少如果您使用TCP(流式)套接字。

这两个问题都可以通过使slen成为固定大小的数组来解决,大到足以容纳你能想到的最大数字(通常十位数),然后发送这个固定长度的数组使用sizeof slen

也许是这样的:

// Ten digits, plus string terminator
char slen[10 + 1];

// Prefix length with zeroes, and don't overflow the buffer
snprintf(slen, sizeof(slen), "%010d", strlen(to_send));

// Send the whole array, including terminator
send(comm_fd, slen, sizeof slen, 0);

然后在接收方,你可以做

// Ten digits, plus string terminator
char slen[10 + 1];

// Receive the whole string, including terminator
recv(comm_fd, slen, sizeof(slen), 0);

// Convert to a number
size_t len = strtoul(slen, NULL, 10);

// Now receive `len` bytes

请注意,我没有错误检查,你应该有。