zoukankan      html  css  js  c++  java
  • C++ windows udp socket编程

    本文仅实现了客户端发送字符串到服务端,服务端将其转换为大写,再发送给服务端

    本人并未系统学习过C++,如果有相关C++的表述错误,请谅解,此类错误不会影响您的阅读
    如果可以,多谢大佬指出错误

    在编写程序是,本人使用了CLION,如果你也使用clion,请先在cmakelists中添加一行

    link_libraries(ws2_32)
    

    相关内容直接阅读代码注释即可

    服务端

    #include <iostream>
    #include <winsock2.h>
    int main(){
        //异步套接字的启动命令
        WSADATA wsadata;
        //第一个参数是版本号,第二个是WSADATA结构体变量的地址值
        WSAStartup(MAKEWORD(2, 2), &wsadata);
    
        SOCKET ServerSocket;
        //创建一个socket
        //第一个参数是族地址,用于指定下层的网路协议,AF_INET表示使用IPV4
        //第二个参数是套接口类型,SOCK_DGRAM (数据报套接字)一般用于UDP
        //详情:https://blog.csdn.net/qing666888/article/details/50419875
        //第三个参数表示协议
        //三个参数类型都是正整数,这里使用了C++预设定的宏(没有系统学过C++,说法有误请谅解)
        ServerSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    
    
        //定义了一个网络地址,sockaddr_in是一个结构体1
        sockaddr_in sockAddrIn;
        memset(&sockAddrIn,0, sizeof(sockAddrIn));
        //指定族地址
        sockAddrIn.sin_family=AF_INET;
        //htons:Host to Network Short 将整型变量从主机字节顺序转变成网络字节顺序
        sockAddrIn.sin_port=htons(9527);
        //INADDR_ANY是一个宏,表示本机
        sockAddrIn.sin_addr.s_addr =inet_addr("127.0.0.1");
    
    
        //将创建的socket与地址绑定,返回值为0表示成功,-1表示失败
        int ret = bind(ServerSocket,(sockaddr*)&sockAddrIn,sizeof(sockAddrIn));
        if(ret==SOCKET_ERROR){
            std::cout<<"bind failed"<<std::endl;
            return -1;
        }
    
    
        while (true){
            char buf[100];
            int len;
    
            //开始接收信息
            //第一个参数:套接字
            //第二个参数:缓冲区
            //第三个参数:缓冲区大小
            //第四个参数:调用操作方式
    
            //第五六个参数传递指针,在函数类被修改,函数运行后,分别得到相应的值
            //第五个参数:接收到的地址
            //第六个参数:接收到的信息实际长度
            int recvRet = recvfrom(ServerSocket,buf, sizeof(buf),0,(sockaddr*)&sockAddrIn,&len);
            //-1表示接收失败
            if(recvRet==-1){
    //            std::cout<<"recieve failed"<<std::endl;
                continue;
            }
    
            //将小写字母转换为大写
            for(int i=0;i<len;i++){
                if(buf[i]>='a'&&buf[i]<='z'){
                    buf[i]='A'+buf[i]-'a';
                }
            }
            //第五个参数:指定要发送的目标ip和端口号
            //第六个参数:第五个参数的长度
            int sendRet = sendto(ServerSocket, buf, sizeof(buf), 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));
            if (sendRet == -1) {
                std::cout << "send failed"<< std::endl;
                break;
            }else{
                std::cout << "send success"<< std::endl;
            }
        }
    
        return 0;
    }
    }
    

    客户端

    #include <iostream>
    #include <winsock2.h>
    int main(){
    
        WSADATA wsadata;
        WSAStartup(MAKEWORD(2, 2), &wsadata);
    
        SOCKET Client;
        Client = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    
    
        sockaddr_in sockAddrIn;
        memset(&sockAddrIn,0, sizeof(sockAddrIn));
        sockAddrIn.sin_family=AF_INET;
        sockAddrIn.sin_port=htons(9527);
        sockAddrIn.sin_addr.s_addr =inet_addr("127.0.0.1");
    
    
    
        //设置socket的选项
        int time_out=2000;
        if(setsockopt(Client,SOL_SOCKET,SO_RCVTIMEO,(char*)&time_out,sizeof(time_out))!=0){
            return -1;
        }
    
        while (true){
            char buf[100];
            int len;
            scanf("%s",buf);
            int sendRet = sendto(Client, buf, sizeof(buf), 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));
            if (sendRet == -1) {
                std::cout<<WSAGetLastError ()<<std::endl;
                std::cout << "send failed"<< std::endl;
                break;
            }else{
                std::cout << "send success"<< std::endl;
            }
            int recvRet = recvfrom(Client,buf, sizeof(buf),0,(sockaddr*)&sockAddrIn,&len);
            if(recvRet==-1){
                continue;
            }else{
                std::cout<<buf<<std::endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    [原创]利用Browser协议探测内网主机操作系统版本(无需端口无视防火墙)
    [EXP]Microsoft Windows 10 (Build 17134)
    [EXP]Microsoft Windows
    [EXP]Apache Spark
    [EXP]Adobe ColdFusion 2018
    [EXP]ThinkPHP 5.0.23/5.1.31
    [EXP]Cisco RV110W
    [EXP]Huawei Router HG532e
    [EXP]Microsoft Windows CONTACT
    [EXP]Microsoft Windows 10
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/12206059.html
Copyright © 2011-2022 走看看