Chinaunix

标题: udp客户端如何保证能收到消息 [打印本页]

作者: jiony    时间: 2008-07-10 11:26
标题: udp客户端如何保证能收到消息
 
 
&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)不停的接消息。
作者: nicozhou    时间: 2008-07-10 12:20
udp本身就是不可靠传输。
作者: ermu    时间: 2008-07-10 12:41
对啊,udp是不保证传输成功率的,除非你在自己的程序里面加上自己的ACK机制
作者: jiony    时间: 2008-07-10 13:00
它是不是成功传输不重要,我的问题是如何保证
recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

它收到消息!
作者: blizzard213    时间: 2008-07-10 19:34
原帖由 jiony 于 2008-7-10 13:00 发表
它是不是成功传输不重要,我的问题是如何保证
recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

它收到消息!


不能保证成功传输, 如何保证收到消息?
你插了内存条它就能收到消息
作者: sunlan    时间: 2008-07-10 22:20
传丢很正常
作者: hiwoody    时间: 2008-07-11 10:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: lanying_wzw    时间: 2008-07-11 11:12
sin_size初始化了吗?这是值-结果参数,必须先初始化的
作者: 随风缘    时间: 2008-07-11 12:43
加入重传机制.
作者: sunorr    时间: 2008-07-11 19:16
自己比对着TCP协议的思想再用UDP协议实现一把~
作者: nicozhou    时间: 2008-07-11 19:57
原帖由 sunorr 于 2008-7-11 19:16 发表
自己比对着TCP协议的思想再用UDP协议实现一把~



那还不如直接上TCP。
作者: sunorr    时间: 2008-07-12 01:57
飞鸽信使用的方法就挺好的~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2