我遇到了一个我无法解决的问题所以我重新启动了。 我遇到了数据封装问题,或者更具体,没有封装。所以在我发现之后,封装很有用,我开始重写代码。
现在我遇到了另一个问题。不知何故,我的发送和接收电话不能正常工作。
以下是我发送的部分:
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和网络编程的新手)
提前致谢
答案 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
请注意,我没有错误检查,你应该有。