使用udp,客户端和服务器之间相互发送消息的例子

love_aiqiu_123 2008-10-29 12:55:19
我用的是sendto和recvfrom来发送和接受消息。
客户端的消息能发送,服务器也能正常接收,但是服务器的回复消息发送不成功!。
...全文
602 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐田伯光 2008-11-03
  • 打赏
  • 举报
回复
Linux有些接口定义得确实有点怪,呵呵。一般我们应用编程转地址进去都是为了回带值,传值都是直接传的。所以很容易的当接口的一个成员要传引用进去时经常就会引起定势错误了。
once_and_again 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 love_aiqiu_123 的回复:]
引用 9 楼 guosha 的回复:
啥问题呢?
需要初始化一个变量
addr_len
[/Quote]c++ 说 ,申请 资源 亟需初始化.
love_aiqiu_123 2008-11-03
  • 打赏
  • 举报
回复
是另一个帖子里的,发错了。结贴给分!!呵呵
平平 2008-11-02
  • 打赏
  • 举报
回复
就是,使用TCP & UDP 的时候,一定要记得变量的初始化问题,特别要注意recvfrom()和sendto()函数中关于传递大小的问题。
我曾经就因为没有初始化的问题,找了好久的错误。
LZ以后使用的时候要小心啊
平平 2008-11-02
  • 打赏
  • 举报
回复
就是,使用TCP & UDP 的时候,一定要记得变量的初始化问题,特别要注意recvfrom()和sendto()函数中关于传递大小的问题。
我曾经就因为没有初始化的问题,找了好久的错误。
LZ以后使用的时候要小心啊
cceczjxy 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 love_aiqiu_123 的回复:]
16楼,我会去看的,有时间。谢谢!
感谢13楼
14,15楼,很强悍!!very thanks!!
[/Quote]

看来楼主分心了,咱们现在才到11楼^_^
jufeng2309 2008-10-31
  • 打赏
  • 举报
回复
不小心。。
love_aiqiu_123 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guosha 的回复:]
啥问题呢?
[/Quote] 需要初始化一个变量
addr_len
快乐田伯光 2008-10-30
  • 打赏
  • 举报
回复
啥问题呢?
love_aiqiu_123 2008-10-30
  • 打赏
  • 举报
回复
已经解决!!1谢谢大家!!
love_aiqiu_123 2008-10-29
  • 打赏
  • 举报
回复

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <errno.h>
#include <netinet/in.h>
#include <math.h>
int get_internet_address(char* host,int len,int * portp,struct sockaddr_in* addrp);
void say_who_called(struct sockaddr_in* addrp);
void reply_to_sender(int sock,char*msg,struct sockaddr_in *addrp,socklen_t len);
int main(int ac,char*av[])
{
int myport=8786;
char buf[BUFSIZ];
memset(buf,0,sizeof(buf));

int sockid;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int addr_len,numbytes;

if((sockid=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror("socket");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(myport);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);

if(bind(sockid,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))== -1 )
{
perror("bind");
exit(1);
}
fcntl(sockid,F_SETFL,O_NONBLOCK);

while(1)
{
numbytes=recvfrom(sockid,buf,BUFSIZ,0,(struct sockaddr*) &their_addr,&addr_len);
if( numbytes == -1)
{
//perror("recvfrom");

}
else
{
printf("recvfrom ok.........\n");
printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
printf("packet is %d bytes long\n",numbytes);
printf("packet contains \"%s\"\n",buf);
/*
strcpy(buf,"02005|05110122|10");
addr_len = sizeof(struct sockaddr);
numbytes = sendto(sockid,buf,strlen(buf),0,(struct sockaddr*)&their_addr,sizeof(struct sockaddr));

if(numbytes==-1)
{
printf("numbytes=%d\n",numbytes);
perror("sendto");
}
else
{
printf("sendto is ok ,now! \n");

}
break;
*/
addr_len = sizeof(struct sockaddr);
say_who_called(&their_addr);
reply_to_sender(sockid,buf,&their_addr,addr_len);
break;
}
}
printf("Everything is ok ,now! \n");
return 0;
}
void say_who_called(struct sockaddr_in* addrp)
{
char host[BUFSIZ];
int port;
get_internet_address(host,BUFSIZ,&port,addrp);
printf("who called from:%s:%d\n",host,port);
}

int get_internet_address(char* host,int len,int * portp,struct sockaddr_in* addrp)
{
strncpy(host,inet_ntoa(addrp->sin_addr),len);

*portp=ntohs(addrp->sin_port);

return 0;

}
void reply_to_sender(int sock,char*msg,struct sockaddr_in *addrp,socklen_t len)
{
int iret=0;
char reply[BUFSIZ+BUFSIZ];
sprintf(reply,"thanks for you %d char message\n",strlen(msg));
iret=sendto(sock,reply,strlen(reply),0,(struct sockaddr*)addrp,len);
if(iret!=-1)
printf("thanks for you %d char message \n",strlen(msg));
else
perror("sendto");
}

服务器端的
快乐田伯光 2008-10-29
  • 打赏
  • 举报
回复
my_addr.sin_addr.s_addr=INADDR_ANY;
改成
my_addr.sin_addr.s_addr=htonl(INADDR_ANY)

另外收到数据的IP跟另一端发过来的IP一致吗?
lyb04551211 2008-10-29
  • 打赏
  • 举报
回复
UDP不要69端口???
love_aiqiu_123 2008-10-29
  • 打赏
  • 举报
回复
16楼,我会去看的,有时间。谢谢!
感谢13楼
14,15楼,很强悍!!very thanks!!
love_aiqiu_123 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guosha 的回复:]
把fcntl那一句去掉试试,
[/Quote]一样,没有变化的。
快乐田伯光 2008-10-29
  • 打赏
  • 举报
回复
把fcntl那一句去掉试试,
zhoujianhei 2008-10-29
  • 打赏
  • 举报
回复
代码没问题,sendto后errno是什么。

23,120

社区成员

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

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