c++簡單實現udp操作和總結

//客戶端

#include <iostream>
#include <winsock2.h>

#include <wheel/unit.hpp>
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=wheel::unit::little_swap16(8080);

    std::size_t value_ip;
    wheel::unit::inet4_pton("127.0.0.1", value_ip);
    sockAddrIn.sin_addr.s_addr =wheel::unit::little_swap32(value_ip);

    //設置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 = sizeof(sockAddrIn);
        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;
}

#include <wheel/unit.hpp>
#include <iostream>
#include <WinSock2.h>


int main()
{
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2, 2), &wsadata);

    SOCKET sfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    sockaddr_in  add;
    memset(&add, 0, sizeof(add));
    add.sin_family = AF_INET;
    add.sin_port = wheel::unit::little_swap16(8080);
    std::size_t value_ip;
    wheel::unit::inet4_pton("127.0.0.1", value_ip);
    add.sin_addr.S_un.S_addr= wheel::unit::little_swap32(value_ip);

    int ret = bind(sfd, (sockaddr*)&add, sizeof(add));
    if (ret == SOCKET_ERROR){
        return 0;
    }

    while (true) {
        char buf[100]={0};
        int len =sizeof(add);

        int recvRet = recvfrom(sfd, buf, sizeof(buf), 0, (sockaddr*)&add, &len);
        //-1表示接收失敗
        if (recvRet == -1) {
            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(sfd, buf, sizeof(buf), 0, (sockaddr*)&add, sizeof(add));
        if (sendRet == -1) {
            std::cout << "send failed" << std::endl;
            break;
        }
        else {
            std::cout << "send success" << std::endl;
        }
    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章