免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4756 | 回复: 11
打印 上一主题 下一主题

udp客户端如何保证能收到消息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-10 11:26 |只看该作者 |倒序浏览
 
 
&nbsp;&nbsp;#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490 /* Server的端口 */

#define MAXDATASIZE 100 /*一次可以读的最大字节数 */

 

int main(int argc, char *argv[])

{

int sockfd, numbytes, sin_size;

char buf[MAXDATASIZE] = “Hello, world!”;

struct hostent *he; /* 主机信息 */

struct sockaddr_in their_addr; /* 对方地址信息 */

 

if (argc != 2) {

fprintf(stderr,"usage: client hostname\n");

exit(1);

}

 

/* get the host info */

if ((he=gethostbyname(argv[1])) == NULL) {

herror("gethostbyname");

exit(1);

}

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) {

perror("socket");

exit(1);

}

 

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT); /* short, NBO */

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

bzero(&(their_addr.sin_zero), 8); /* 其余部分设成0 */

 

numbytes = sendto(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr,sizeof(their_addr))

if (numbytes == -1) {

perror(“sendto");

exit(1);

}

printf(“Send: %s"
,buf);

 

numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

if (numbytes == -1) {

perror("recvfrom");

exit(1);

}

 

buf[numbytes] = '\0';

printf("Received: %s",buf);

close(sockfd);

return 0;

}

   


代码如上,我怎么保证他接收到消息呢???我试了下,经常介绍不到消息,可以去掉
if (numbytes == -1) {

perror("recvfrom");

exit(1);

}

这一段。这是个客户端程序,如果是服务端的话,可以用while(1)不停的接消息。

论坛徽章:
0
2 [报告]
发表于 2008-07-10 12:20 |只看该作者
udp本身就是不可靠传输。

论坛徽章:
0
3 [报告]
发表于 2008-07-10 12:41 |只看该作者
对啊,udp是不保证传输成功率的,除非你在自己的程序里面加上自己的ACK机制

论坛徽章:
0
4 [报告]
发表于 2008-07-10 13:00 |只看该作者
它是不是成功传输不重要,我的问题是如何保证
recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

它收到消息!

论坛徽章:
0
5 [报告]
发表于 2008-07-10 19:34 |只看该作者
原帖由 jiony 于 2008-7-10 13:00 发表
它是不是成功传输不重要,我的问题是如何保证
recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

它收到消息!


不能保证成功传输, 如何保证收到消息?
你插了内存条它就能收到消息

论坛徽章:
0
6 [报告]
发表于 2008-07-10 22:20 |只看该作者
传丢很正常

论坛徽章:
0
7 [报告]
发表于 2008-07-11 10:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2008-07-11 11:12 |只看该作者
sin_size初始化了吗?这是值-结果参数,必须先初始化的

论坛徽章:
0
9 [报告]
发表于 2008-07-11 12:43 |只看该作者
加入重传机制.

论坛徽章:
0
10 [报告]
发表于 2008-07-11 19:16 |只看该作者
自己比对着TCP协议的思想再用UDP协议实现一把~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP