网络编程:使用UDP协议实现服务器与客户端的交互
admin
2024-02-11 13:17:07
0

服务器

**************************************************************************************************************

#include
#include         
#include
#include
#include                          
#include
#include
#define PORT 8888
#define IP   "192.168.31.162"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"__%d__\n",__LINE__);\
    perror("msg");\
}while(0)

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port  = htons(PORT);//端口号(主机端口号转为网络字节序)
    sin.sin_addr.s_addr  =inet_addr(IP);//IP的网络字节序
    //2、绑定服务器IP地址和端口号
    if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("Udp服务器绑定成功\n");
    //变量初始化
    char buf[32]="";
    struct sockaddr_in cin;
    socklen_t cinlen=sizeof(cin);

    while(1)
    {

    //3、接收数据
    ssize_t rcv=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&cinlen);
        if(rcv<0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
    printf("__%d__,%s:%d:%s\n",\
            __LINE__,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
    
    //4、发送数据,要指定发送到的地址
    //    bzero(buf,sizeof(buf));
    strcat(buf,"*_*");
    ssize_t sd = sendto(sfd,&buf,sizeof(buf),0,(struct sockaddr*)&cin,cinlen);    
    if(sd<0)
        {
            ERR_MSG("sendto");
            return -1;
        }
    printf("发送成功\n");

    }
    //5、关闭套接字
    close(sfd);
    return 0;
}

**************************************************************************************************************

客户端

**************************************************************************************************************

#include
#include         
#include
#include
#include                          
#include
#include
//服务器的端口号和主机IP
#define SIN_PORT 8888
#define SIN_IP   "192.168.31.162"
//客户端的端口号和主机IP
#define CIN_PORT 6666
#define CIN_IP   "192.168.31.162"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"__%d__\n",__LINE__);\
    perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
    //1、创建套接字(服务器端)
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    //服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port  = htons(SIN_PORT);//端口号(主机端口号转为网络字节序)
    sin.sin_addr.s_addr  =inet_addr(SIN_IP);//服务器IP的网络字节序
    //客户端地址信息结构体
    struct sockaddr_in cin;
/*
    cin.sin_family = AF_INET;
    cin.sin_port  = htons(CIN_PORT);//端口号(客户端主机端口号转为网络字节序)
    cin.sin_addr.s_addr  =inet_addr(CIN_IP);//客户端IP的网络字节序

    //2、绑定客户端IP地址和端口号
    if(bind(sfd,(struct sockaddr *)&cin,sizeof(cin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("Udp客户端绑定成功\n");
    */
    //变量初始化
    char buf[32]="";
    
    socklen_t sinlen=sizeof(sin);
    socklen_t cinlen=sizeof(cin);
    ssize_t sd=0,rcv=0;
    while(1)
    {

        //4、发送数据,要指定发送到的地址
        bzero(buf,sizeof(buf));
        printf("要发送到服务器的数据-->");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1] = 0;

         sd = sendto(sfd,&buf,sizeof(buf),0,(struct sockaddr*)&sin,sinlen);    
        if(sd<0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("发送成功\n");

        //3、接收数据
         rcv=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&cinlen);
        if(rcv<0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("__%d__,%s:%d:%s\n",\
                __LINE__,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);


    }
    //5、关闭套接字
    close(sfd);
    return 0;
}
 

相关内容

热门资讯

云米科技CEO给员工奖励小米Y... 【CNMO科技消息】据CNMO了解,云米科技创始人兼CEO陈小平在社交平台上宣布,在近日的公司年会上...
上证180ETF指数基金(53... 截至2026年1月23日 15:00,上证180指数(000010)下跌0.31%。成分股方面涨跌互...
央行连续14月增持黄金,机构:... 1月26日早盘,金银价格再创历史新纪录:现货黄金首次突破5000美元/盎司整数关口,距离现货金首次突...
重庆川仪自动化股份有限公司 2... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
突破5000美元大关!现货黄金... 现货黄金价格站上5000美元/盎司。 1月26日,现货黄金首次站上5000美元/盎司,再创历史新高,...
原创 口... 曾与古井贡酒、迎驾贡酒、金种子酒并称“徽酒四朵金花” 的口子窖,正遭遇严峻的业绩滑铁卢。归母净利润预...
东鹏饮料今起招股,卡塔尔投资局... 来源:独角兽早知道 东鹏饮料(09980.HK)发布公告,公司拟全球发售4088.99万股H股,中...
1月26日国际晨讯丨现货黄金首... 现货黄金首次突破5000美元/盎司;美联储即将举行2026年首次议息会议;特斯拉、苹果、微软 、Me...
俄健身市场迎来“温和”式增长 【环球时报综合报道】今年俄罗斯健身服务市场将继续扩大,但增速下降。据FitnessData公司分析师...
洛阳钼业巴西金矿完成交割 将秉... 2026年开年,洛阳钼业海外并购再传捷报——公司以最高10.15亿美元收购的巴西金矿资产于1月23日...
离谱!美军飞行秀竟致日本教师无... 这是2023年11月25日在日本冲绳美军普天间基地驻留的“鱼鹰”运输机。新华社记者冯武勇摄 美军调查...
量质齐升 国产CPU龙头业绩大... 本报记者 贺王娟 1月23日晚间,国产CPU(中央处理器)龙头企业龙芯中科技术股份有限公司(以下简称...
原创 想... 辞掉工作,全职炒股。 这是很多股民的梦想——不用看老板脸色,靠自己的判断赚钱。但现实是,多数人没等到...
商业航天热度不减 产业链公司频... 转自:证券日报     本报记者 张文湘     见习记者 占健宇     开年以来,商业航天赛道持...
西兰花和花椰菜,怎么选更健康? 无论是护肝、增强免疫力,还是降低某些癌症风险,十字花科蔬菜都常被推荐。其中,西兰花和花椰菜最常被拿来...
原创 马... 马克龙在达沃斯一开口,全世界都竖起了耳朵。 不是因为他讲了什么新奇话,而是他居然当着全球政商精英的面...
降本加量扩围 结构性货币政策增... ● 本报记者 彭扬 欧阳剑环 “1.5亿元的贷款不仅解决了企业技改资金的燃眉之急,更让我们对推进智能...
高盛喊涨黄金至5400美元!富... 黄金价格新拐点:从央行主导到全民抢金 2026年1月,全球顶级投行高盛抛出重磅预测,将黄金目标价从4...