Linux UDP Server and Client Sample.Linux 下 UDP 服务和客户端程序示例

11 篇文章 0 订阅
这篇博客介绍了Linux环境下UDP服务端和客户端的示例程序,重点讲解了如何使用recvfrom和sendto函数进行数据收发。文中提到原程序存在一个错误,即服务器端在调用recvfrom之前未正确初始化addr的addrlen,这导致服务器无法正确解析地址。通过将addrlen初始化为sizeof(addr),问题得到解决。
摘要由CSDN通过智能技术生成

linux下UDP 客户端和服务端程序示例,使用recvfrom与sendto函数

程序转自hoyt的<Linux网络编程>,解决了作者的client端收不到数据的情况,但因为联系不到作者,只好在此贴出,如果有哪位朋友可以代我通知作者的或告诉我作者联系方式的话,本人不胜感激.

原程序错误原因:server端使用recvfrom()前为将用来标识记录地址的sockadd_in addr的addrlen为初始化,导致server端解析地址错误.

解决方法:将addrlen初始化为sizeof(addr) 

 
/**********UDP服务端程序UDPserver.c***********/
#include 
< sys / types.h >
#include 
< sys / socket.h >
#include 
< netinet / in .h >
#include 
< arpa / inet.h >
#include 
< unistd.h >
#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< errno.h >
#include 
< string .h >

#define  SERVER_PORT 8888
#define  MAX_MSG_SIZE 1024

void  udps_respon( int  sockfd)  {
    
struct sockaddr_in addr;
    unsigned 
int addrlen;
    
int n;
    
char msg[MAX_MSG_SIZE];

    
while(1{
    
// 从网络上读,写到网络上去
        
// 初始化addr长度!
        addrlen = sizeof(addr);
        
if((n = recvfrom(sockfd,msg,MAX_MSG_SIZE,0,
            (
struct sockaddr *)&addr,&addrlen)) < 0{
            fprintf(stderr,
"Recveive packahe error:%s",
                strerror(errno));
            
continue;
        }

        msg[n 
- 1= '';
        
// 显示服务器端已经收到了信息
        fprintf(stdout,"I have received %s from %sn",msg,
            inet_ntoa(addr.sin_addr));
        sendto(sockfd,msg,n,
0,(struct sockaddr *)&addr,addrlen);
    }

}


int  main( void {
    
int sockfd;
    
struct sockaddr_in addr;
    sockfd 
= socket(AF_INET,SOCK_DGRAM,0);
    
if(sockfd < 0{
        fprintf(stderr,
"Socket Error:%sn",strerror(errno));
        exit(
1);
    }


    bzero(
&addr,sizeof(struct sockaddr_in));
    addr.sin_family 
= AF_INET;
    addr.sin_addr.s_addr 
= htonl(INADDR_ANY);
    addr.sin_port 
= htons(SERVER_PORT);

    
if(bind(sockfd,(struct sockaddr *)&addr,
        
sizeof(struct sockaddr_in)) < 0{
        fprintf(stderr,
"Bind Error:%sn",strerror(errno));
        exit(
1);
    }


    udps_respon(sockfd);
    close(sockfd);
    exit(
1);
}


/*****UDP客户端程序UDPclient.c********/
#include 
< sys / types.h >
#include 
< sys / socket.h >
#include 
< netinet / in .h >
#include 
< arpa / inet.h >
#include 
< errno.h >
#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< string .h >
#include 
< unistd.h >

#define  MAX_BUF_SIZE 1024

void  udpc_request( int  sockfd, const   struct  sockaddr_in  * addr, int  len)  {
    
char buffer[MAX_BUF_SIZE];
    
int n;

    
while(1{
    
// 从键盘读入,写到服务端
        fgets(buffer,MAX_BUF_SIZE,stdin);
        sendto(sockfd,buffer,strlen(buffer),
0,(struct sockaddr *)addr,len);
        bzero(buffer,MAX_BUF_SIZE);
        
// 从网络上读,写到屏幕上
        n = recvfrom(sockfd,buffer,MAX_BUF_SIZE,0,NULL,NULL);
        buffer[n 
- 1= '';
        fprintf(stdout,
"I received %s from server.n",buffer);
    }

}


int  main( int  argc, char   ** argv)  {
    
int sockfd,port;
    
struct sockaddr_in addr;

    
if(argc != 3)  {
        fprintf(stderr,
"Usage:%s server_ip server_portn",argv[0]);
        exit(
1);
    }

    
if((port = atoi(argv[2])) < 0{
        fprintf(stderr,
"Usage:%s server_ip server_portn",argv[0]);
        exit(
1);
    }

    
    sockfd 
= socket(AF_INET,SOCK_DGRAM,0);
    
if(sockfd < 0{
        fprintf(stderr,
"Socket Error:%sn",strerror(errno));
        exit(
1);
    }

    
// 填充服务端的资料
    bzero(&addr,sizeof(struct sockaddr_in));
    addr.sin_family 
= AF_INET;
    addr.sin_port 
= htons(port);
    
if(inet_aton(argv[1],&addr.sin_addr) < 0{
        fprintf(stderr,
"IP error:%sn",strerror(errno));
        exit(
1);
    }

    udpc_request(sockfd,
&addr,sizeof(struct sockaddr_in));
    close(sockfd);
    exit(
0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值