• 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。


    1.服务器

    #include<winsock2.h> //包含头文件
    #include<stdio.h>
    #include<windows.h>
    #pragma comment(lib,"WS2_32.lib") //连接套接字库
    int main()
    {
    WSADATA data; //定义结构体变量
    WORD w=MAKEWORD(2,0); //定义套接字版本
    char sztext[]="欢迎你 "; //定义欢迎信息
    ::WSAStartup(w,&data); //初始化套接字库
    SOCKET s; //定义套接字句柄
    s=::socket(AF_INET,SOCK_DGRAM,0); //创建 UDP 套接字
    sockaddr_in addr,addr2; //定义套接字地址结构变量
    int n=sizeof(addr2); //获取套接字地址结构变量大小
    char buff[11]={0}; //接收数据缓冲区
    addr.sin_family=AF_INET; //初始化地址结构
    addr.sin_port=htons(75);
    addr.sin_addr.S_un.S_addr=INADDR_ANY;
    ::bind(s,(sockaddr*)&addr,sizeof(addr));//绑定套接字
    printf("UDP 服务器已经启动 ");//显示提示信息
    while(1)
    {
    if(::recvfrom(s,buff,11,0,(sockaddr*)&addr2,&n)!=0) //接收客户端信息
    {
    printf("%s 已经连接上 ",inet_ntoa(addr2.sin_addr));
    printf("%s ",buff);
    ::sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr2,n); //发送数据到客户端
    break;
    }
    }
    ::closesocket(s); //关闭套接字对象
    ::WSACleanup(); //释放套接字库
    if(getchar()) //如果有输入则关闭程序
    {
    return 0; //正常结束程序
    }
    else
    {::Sleep(100); //应用程序睡眠
    }
    }

    2.客户端

    #include<winsock2.h> //包含头文件
    #include<stdio.h>
    #include<windows.h>
    #pragma comment(lib,"WS2_32.lib") //连接套接字库
    int main()
    {
    WSADATA data; //定义结构体变量
    WORD w=MAKEWORD(2,0); //初始化套接字版本号
    char sztext[]="服务器,你好! "; //定义字符数组显示连接信息
    ::WSAStartup(w,&data); //初始化套接字库
    SOCKET s; //定义套接字
    s=::socket(AF_INET,SOCK_DGRAM,0); //创建 UDP 套接字
    sockaddr_in addr,addr2; //定义套接字地址
    int n=sizeof(addr2);
    char buff[10]={0};
    addr.sin_family=AF_INET; //初始化地址结构
    addr.sin_port=htons(75);
    addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    printf("UDP 客户端已经启动 ");
    if(::sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr,n)!=0) //发送信息
    {
    ::recvfrom(s,buff,10,0,(sockaddr*)&addr2,&n); //接受信息
    printf("服务器说:%s ",buff);
    ::closesocket(s); //关闭套接字
    ::WSACleanup(); //释放套接字库
    }
    if(getchar()) //如果有输入则关闭程序
    {
    return 0; //正常结束程序
    }
    else
    {::Sleep(100);
    }
    }

  • 相关阅读:
    TortoiseGit日常使用指南
    Ajax在MVC中的应用
    STL源码学习内存管理
    功能最强大的.Net代码生成器——EasyCode
    TortoiseGit使用入门
    负载均衡时数据包流程详解
    C++异步编程 for VS2011
    (译)一个通用快速的反射方法调用
    移位运算
    使用Autofac在ASP.NET Web API上实现依赖注入
  • 原文地址:https://www.cnblogs.com/chengJAVA/p/3343345.html
Copyright © 2020-2023  润新知