关闭

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

2183人阅读 评论(1) 收藏 举报

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:65394次
    • 积分:1086
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:23篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论