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);
}
Logo

更多推荐