关于网络通信中recvfrom和sendto的用法

c05170519 2011-09-27 04:06:20
我在服务器里广播一条系统信息(buf3),然后接受客户端发来的信息(buf4),再转发给所有的客户;在客户端里接受服务器发来的信息并显示,发送信息给客户端。用UDP来实现。
服务器里:
sendto(sockfd,buf3,sizeof(buf3),0,NULL,NULL);
printf("recv111111111\n");
recvfrom(sockfd,buf4,MAXLINE,0,NULL,NULL);
// printf("recv333333\n");
sendto(sockfd,buf4,sizeof(buf4),0,NULL,NULL);
客户端里:
recvfrom(sockfd,buf2,MAXLINE,0,NULL,NULL);
printf("recv from server:%s\n",buf2);
sendto(sockfd,buf,sizeof(buf),0,(SA *)&servaddr,sizeof(servaddr));

问题:
recvfrom函数后两个参数应该为&peeraddr和&peerlen,用以保存接受到的数据的来源地址和地址大小,如果在客户端,设置为NULL,意为不保存服务器的地址,但是在服务器端也设置为NULL也可以吗?“ printf("recv111111111\n");”这句输出,但是那句注释掉的 “printf("recv333333\n");”没有输出,循环也卡在这里。

求教~
...全文
442 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
二狗蹲坑 2011-09-28
  • 打赏
  • 举报
回复
NULL改为255的地址吧。
giant1st 2011-09-28
  • 打赏
  • 举报
回复
广播的话要用 多播地址啊,根据你的意思 估计224.0.0.1【所有主机组】就是了
dongjiawei316 2011-09-28
  • 打赏
  • 举报
回复
客户端sendto肯定也不可以。。。
fengying0529 2011-09-28
  • 打赏
  • 举报
回复
你的意思是服务器端也发送广播啰
如果是这个意思的话把sendto要传送的网络地址换为其广播地址试试
c05170519 2011-09-28
  • 打赏
  • 举报
回复
刚才说整个网络不知道对不对 我真实的意思是如果有多个客户端怎么办呢?我想把广播信息发送给多个客户端。
c05170519 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dongjiawei316 的回复:]

引用 6 楼 c05170519 的回复:
引用 3 楼 fengying0529 的回复:

你的sendto失败了吧 ,你把要传送的网络地址设置为null了
要传送的网络地址,我以为写了的话就是指定某个客户端地址,不写的话直接发布到整个网络,我这样理解对吗?因为我手头的例程序里面,客户端里面recvfrom后面两个参数就是为空的,所以我才有上面的想法。
如果你愿意(多半会54...……
[/Quote]好像客户端sendto后两个参数为NULL是可以的,服务器端就不行,能解释一下吗?
dongjiawei316 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 c05170519 的回复:]
引用 3 楼 fengying0529 的回复:

你的sendto失败了吧 ,你把要传送的网络地址设置为null了
要传送的网络地址,我以为写了的话就是指定某个客户端地址,不写的话直接发布到整个网络,我这样理解对吗?因为我手头的例程序里面,客户端里面recvfrom后面两个参数就是为空的,所以我才有上面的想法。
如果你愿意(多半会54...)的加我QQ:745826722
[/Quote]
这样是不行的,如果你想把数据发到整个网络,可以把目的IP设为组播地址(224开头的地址)。
我知道你为什么没有打印了,因为你的发送失败,所以你的客户端recvfrom接收不到数据,因此而阻塞。程序运行不到printf那一句。。。。。。。。
c05170519 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fengying0529 的回复:]

sendto(sockfd,buf3,sizeof(buf3),0,NULL,NULL);
//你在这边加printf试试 应该在这边就不能打印了
recvfrom(sockfd,buf4,MAXLINE,0,NULL,NULL);
printf("recv333333333 from serveqqr:\n");//这里不输出
[/Quote]有输出 有的
c05170519 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fengying0529 的回复:]

你的sendto失败了吧 ,你把要传送的网络地址设置为null了
[/Quote]要传送的网络地址,我以为写了的话就是指定某个客户端地址,不写的话直接发布到整个网络,我这样理解对吗?因为我手头的例程序里面,客户端里面recvfrom后面两个参数就是为空的,所以我才有上面的想法。
如果你愿意(多半会54...)的加我QQ:745826722
c05170519 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dongjiawei316 的回复:]

recvfrom默认是阻塞的,你可以把它设成非阻塞的,试试。设置方法见:http://topic.csdn.net/u/20110922/23/efea0a48-88e6-4f91-bdbc-7c7cad7e25c2.html

另外我有一个疑问,你的sendto的最后两个参数怎么是NULL的,不应该是目的IP吗?能解释一下吗?
[/Quote]要传送的网络地址,我以为写了的话就是指定某个客户端地址,不写的话直接发布到整个网络,我这样理解对吗?因为我手头的例程序里面,客户端里面recvfrom后面两个参数就是为空的,所以我才有上面的想法。
如果你愿意(多半会54...)的加我QQ:745826722
fengying0529 2011-09-28
  • 打赏
  • 举报
回复
sendto(sockfd,buf3,sizeof(buf3),0,NULL,NULL);
//你在这边加printf试试 应该在这边就不能打印了
recvfrom(sockfd,buf4,MAXLINE,0,NULL,NULL);
printf("recv333333333 from serveqqr:\n");//这里不输出
fengying0529 2011-09-28
  • 打赏
  • 举报
回复
你的sendto失败了吧 ,你把要传送的网络地址设置为null了
fensnote 2011-09-28
  • 打赏
  • 举报
回复
可以的
dongjiawei316 2011-09-27
  • 打赏
  • 举报
回复
recvfrom默认是阻塞的,你可以把它设成非阻塞的,试试。设置方法见:http://topic.csdn.net/u/20110922/23/efea0a48-88e6-4f91-bdbc-7c7cad7e25c2.html

另外我有一个疑问,你的sendto的最后两个参数怎么是NULL的,不应该是目的IP吗?能解释一下吗?
c05170519 2011-09-27
  • 打赏
  • 举报
回复
补充下程序:
服务器端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define MAXLINE 50
typedef struct sockaddr SA;

int main(int argc,char **argv)
{

int sockfd,nbyte;
socklen_t peerlen;
struct sockaddr_in myaddr,peeraddr;
char buf1[MAXLINE]="It's time to login";
char buf2[MAXLINE]="It's time to exit";
char buf3[MAXLINE]="hello everyone";
char buf4[MAXLINE];

if((sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
{
printf("fail to socket\n");
exit(-1);
}

bzero(&myaddr,sizeof(myaddr));
myaddr.sin_family=PF_INET;
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
myaddr.sin_port=htons(8888);

if(bind(sockfd,(SA *)&myaddr,sizeof(myaddr))<0)
{
printf("fail to bind\n");
exit(-1);
}

sendto(sockfd,buf1,sizeof(buf1),0,NULL,NULL);

int i=0;
while(1)
{

peerlen=sizeof(peeraddr);
sendto(sockfd,buf3,sizeof(buf3),0,NULL,NULL);

recvfrom(sockfd,buf4,MAXLINE,0,NULL,NULL);
printf("recv333333333 from serveqqr:\n");//这里不输出
sendto(sockfd,buf4,sizeof(buf4),0,NULL,NULL);
i++;
if(i==4) break;
}
sendto(sockfd,buf2,sizeof(buf2),0,NULL,NULL);

}

客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define MAXLINE 50

typedef struct sockaddr SA;

int main(int argc,char **argv)
{
int sockfd,nbyte;
struct sockaddr_in servaddr;
char buf[MAXLINE]="hello server";
char buf2[MAXLINE];

if((sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
{
printf("fail to socket\n");
exit(-1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=PF_INET;
servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servaddr.sin_port=htons(8888);

if(connect(sockfd,(SA *)&servaddr,sizeof(servaddr))<0)
{
printf("fail to connect\n");
exit(-1);
}



recvfrom(sockfd,buf2,MAXLINE,0,NULL,NULL);
printf("recv from serveqqr:\n");
printf("recv from server:%s\n",buf2);
//这里也不输出
sendto(sockfd,buf,sizeof(buf),0,(SA *)&servaddr,sizeof(servaddr));
}

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧