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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM