网络编程:使用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;
}
 

相关内容

热门资讯

越秀区多维经营账服务细致入微的... 越秀区多维经营账服务细致入微的代理机构参考 在广州越秀区这一商贸活跃的核心区域,中小企业对财税服务...
教人挣钱的自媒体平台叫什么 教人挣钱的自媒体平台叫什么?这问题问得太到位了。说实话,我也曾经翻遍全网、踩过无数坑,就为了找一个真...
湖人被无情戏耍又是三节崩 里夫... 与雷霆的半决赛打到第三场,一种无望的情绪已彻底裹挟了湖人全队,彻底无法被摆脱了。 所有人都清楚,湖人...
原创 欧... 据环球网综合报道,欧盟正处于前所未有的抉择压力之下。在俄乌冲突延续近四年的沉重阴影下,欧盟内部关于援...
原创 1... 雷达财经出品 文|丁禹 编|孟帅 五一假期刚刚结束,市值百亿的川酒上市公司水井坊,其核心管理层再次迎...
美银Hartnett:材料板块... 美银证券首席投资策略师Michael Hartnett在最新报告中点名材料板块,称其将是下一个“牛市...
情绪消费的好日子,还剩多久 文|强调Next 2025年是中国潮玩行业最热闹的一年,也是从业者最难熬的一年。 热闹是真的热闹。...
原创 A... 5月11日,新股打新市场迎来春光集团(301531)的上市交易。它在创业板发行申购,而创业板指刚刚创...
扒了扒A股1060家AI企业的... 文 | 硅基研究室 kiki 1060家。 这是人工智能指数(885728)成分股的数量,覆盖了A...
环球下周看点:4月CPI为美联... 财联社5月10日讯(编辑 史正丞)在刚刚过去的一周里,尽管霍尔木兹海峡仍未畅通、美伊在零星交火和“接...
龙头有色押注新能源 记者 王雅洁 2026年5月7日,华友钴业(603799)公告,拟以2.1亿美元(约合14.28亿元...
原创 特... 特朗普的“关税大棒”又一次被自己国家的法院敲断了! 三个月内两度因关税败诉,刚换法律依据就被驳回,可...
与事实严重不符!中汽协发声:8... 关于“8家新能源车企因锁电问题被约谈”的传闻仍在发酵,但事件刚刚出现反转。 5月9日,中国汽车工业协...
陕西农信陈仓联社:深耕本土惠民... 为持续优化辖区支付服务生态,完善本地便民消费场景,切实解决商户经营收款痛点、提升群众消费支付体验,陈...
又一家公司AI优先,裁员20%... 多知5月9日消息,美国科技企业 Cloudflare 周四在2026年Q1分析师电话会议上宣布裁员 ...
钟可祥任厦门钨业董事长 天眼查App显示,近日,厦门钨业(600549)发生工商变更,黄长庚卸任法定代表人、董事长,由钟可祥...
南昌第五医院甲状腺科江辉:甲状... 请教一下,我已在一侧甲状腺切除手术后过去了半个月,如今是否可以适量食用海参、鱼、虾、蟹? 答:鉴于甲...
原创 今... 5月9日这波金价,得跟大伙唠唠,放在近15年行情里算少见,以前2011年欧债危机、2020年全球避险...
华芢生物港股上市后首份年报:暂... 3月30日,华芢生物科技(青岛)股份有限公司发布了自2025年12月登陆港交所以来的第一份年度业绩报...
侃财邦|“双豆CP”,老少皆宜... 提到手作消费,你想到的还是商场里供儿童娱乐的石膏娃娃、沙画?如今,拼豆、豆荚娃娃这对“双豆CP”,已...