我一直在研究如何在C中使用UDP传输图像,我创建了一个有时可以工作的代码,有时却没有。我认为问题在于,有时服务器会收到比写入更多的包。我知道我正在尝试创建TCP,但这正是我所寻求的,但不知道该怎么做。
我认为要修复它,客户端应该发送img的buff,并在服务器回复客户端时才发送第二部分。
以下是代码:
客户端:
while (!feof(p))
{
fread(*&c, 1, BLEN, p);
sprintf(buf, "%s", *&c);
temp=sendto(s,buf,BLEN, 0, (struct sockaddr *) &si_other, slen);
//sleep(3);
//printf("%d ",temp);
if(temp < 0)
{
fprintf(stderr,"sendto error.\n");
printf("erro");
exit(1);
}
i++;
}
服务器:
while(1){
if(recvfrom(s, buf, BLEN, 0, (struct sockaddr *) &si_other, (unsigned int *) &slen)==-1){
perror("recvfrom error.\n");
exit(1);
}
//printf("%s ", &si_other);
flagr[0] = buf[0];
flagr[1] = buf[1];
flagr[2] = buf[2];
if (strcmp(flagr, flag) == 0 ){
break;
}
fwrite(buf, 1, BLEN, pp);
i++;
}
答案 0 :(得分:2)
UDP是一种数据报协议,这意味着每次调用sendto
都会发送一条消息。如果该消息大于IP数据包可以容纳的消息,则它将在多个IP数据报中分段。如果这些片段中的任何一个未能到达,那么整个操作系统将被删除。
数据需要以不超过大约1450字节的块发送。然后接收方将需要读取每个数据包,因为UDP不保证数据按顺序到达,您需要按正确的顺序重新组装它们。
这意味着每个数据包必须有一个用户定义的标题,其中包含序列号,以便接收者知道将它们放入的顺序。
您还需要担心重新传输,因为UDP不保证实际接收到发送的数据包。
我编写了一个名为UFTP的程序来完成所有这些工作。查看文档和代码,了解通过UDP实现可靠数据传输需要做些什么。