网络编程套接字--udp通信

这篇博客通过socket套接字展示了如何设计一个基于UDP的简单聊天小程序。提供了服务端(udp_server.cpp)和客户端(udp_client.cpp)的代码示例。此外,还提到了另一篇关于TCP聊天小程序的详细解释。
摘要由CSDN通过智能技术生成

本片博客使用socket套接字设计一个简单的udp聊天小程序,因为udp比较简单,仅将代码列在此处。另有一篇使用socket套接字完成tcp聊天小程序,将重点讲解,博客地址:网络编程套接字—tcp简单通信程序详解


服务端 udp_server.cpp

#include <iostream>
#include <unistd.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
//目标;实现一个udp的简单聊天程序,本文件为服务端
//udp_server通信步骤:
//1.创建socket套接字

//2.给套接字绑定地址信息
//3.接收客户端的数据
//4.向客户端回复数据
//5.通信结束,关闭socket
int main()
{
  //1.创建socket套接字
  int sockfd =  socket(AF_INET,SOCK_DGRAM ,0);
  if (sockfd < 0)
  {
    std:: cout<<"create socket error!!"<<std::endl;
    return -1;
  }

  //2.构建sockaddr_in结构存储地址信息,注意sockaddr_in只能用于IPv4
  //
  struct sockaddr_in serv_addr;
  socklen_t len = sizeof(serv_addr);
  serv_addr.sin_port = htons(10000);//端口号  sin_port为无符号短整型2个字节
  serv_addr.sin_family = AF_INET;//类型
  serv_addr.sin_addr.s_addr = inet_addr("192.168.184.137");//ip地址  typedef uint32_t in_addr_t 32位无符号整数
  int ret = bind(sockfd,(struct sockaddr*)&serv_addr,len);//倘若绑定,就将绑定的地址作为自己的ip地址和端口号
  if (ret < 0)
  {
    std::cout<<"bind error!!"<<std::endl;
    return -1;
  }

  std::cout<<"udp_server is ready,let's chat"<<std::endl;
  while (1)
  {
    //3接收客户端的数据
    char buff[1024] = {0};//用来接收客户端发来的数据
    sockaddr_in cli_addr;//用于
    len = sizeof(cli_addr);//地址信息长度
    ssize_t size = recvfrom(sockfd, buff, 1023,0,(struct sockaddr*)&cli_addr,&len);//cli_addr接收对端地址信息
    if (size < 0)
    {
      std::cout<<"no data to recv"<<std::endl;
      return -1;
    
    }
    printf("client[%s %d]say: %s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buff);
    //4.向客户端发送数据
    memset(buff,0x00,len);
    std::cin >> buff;
    sendto(sockfd,buff, strlen(buff), 0,  (struct sockaddr *)&cli_addr, len);
    //sendto第五个参数存储对端的地址信息

  }
  close(sockfd);



  return 0;
}

客户端 udp_client.cpp

#include<iostream>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<stdio.h>
#include<arpa/inet.h>
//目标:实现一个简单的udp客户端
//通信步骤:
//1.创建socket套接字
//2.绑定地址信息(不推荐!因为绑定有可能失败,且我们只要数据能发送出去即可)
//3.向客户端发送数据
//4.接收客户端发来的数据
//5.关闭套接字
int main()
{
    //1.创建套接字
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if (sockfd <0)
    {
        std::cout<<"create socket error"<<std::endl;
    }

    //2.绑定客户端的地址信息,不做!!
    
    struct sockaddr_in serv_addr;//构建服务端的地址信息块,用于后面发送
    socklen_t size = sizeof(serv_addr);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(10000);
    serv_addr.sin_addr.s_addr = inet_addr("192.168.184.137");
    

    std::cout<<"udp_client is ready,let's chat!"<<std::endl;
    while(1)
    {
        //3.向服务端发送数据
        char buff[1024] = {0};
        std::cin >> buff;
        sendto(sockfd,buff, strlen(buff), 0 ,(struct sockaddr *)&serv_addr,size);
        
        //4.接收服务端发来的数据
        memset(buff,0x00,1024);
        size_t len =  recvfrom(sockfd, buff, 1023, 0,(struct sockaddr *)&serv_addr, &size);
        if (len < 0)
        {
            std::cout<<"no data to recv"<<std::endl;
            close(sockfd);
            return -1;
        }
        
        printf("client[%s %d]say: %s\n",inet_ntoa(serv_addr.sin_addr),ntohs(serv_addr.sin_port),buff);

    }
    close(sockfd);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值