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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

余额充值