window QT 環境下編寫網絡程序(一)---簡易的UDP收發程序

一、window QT開發環境下UDP手法程序與Linux相比大同小異,都是使用socket機制,本文粗略分析udp 收發端的編寫流程

二、應用程序的編寫

1.接收端

int socket_recv(void){
      printf("recv before socket_recv starting...\n");
    //初始化socket
    DWORD ver;
    WSADATA WSAData;
    //在調用WSAStartup要告知Windows要使用什麼版本的socket
    ver = MAKEWORD(1,1);
    WSAStartup(ver,&WSAData); //Windows 要求,只要使用socket,第一步必須調用這個函數
    //初始化socket完成
    /**
     * @brief st
     * params1: 協議族,指定socket使用哪一個協議族
     * params2: 套接字類型,使用協議族中哪一個協議
     * params3: 一般默認填寫0
     */
    SOCKET st = socket(AF_INET,SOCK_DGRAM,0);//建立一個socket
    struct sockaddr_in addr;
    memset(&addr,0,sizeof(addr));//初始化addr
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8090);
    addr.sin_addr.s_addr = inet_addr("192.168.1.102");
    //addr.sin_addr.s_addr = htonl(INADDR_ANY);//作爲接收方,不需要指定具體的IP地址,接受主動的地址
    if(bind(st,(struct sockaddr *)&addr,sizeof(struct sockaddr))){
        printf("bind error...\n");
        return -1;
    } //當端口號和程序綁定
    printf("recv before...\n");
    char buf[1024]={0};
    struct sockaddr_in src_addr;
    int len = sizeof(struct sockaddr);
    memset(buf,0,sizeof(buf));
    recvfrom(st,buf,sizeof(buf),0,(struct sockaddr *)&src_addr,&len);
    printf("buf:%s src_ip:%s\n src_port:%d\n",buf,inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port));
    closesocket(st);
    WSACleanup();//釋放win socket 的相關的資源
    return 0;
}

2.發送端

int socket_send(void){
    //初始化socket
    DWORD ver;
    WSADATA WSAData;
    //在調用WSAStartup要告知Windows要使用什麼版本的socket

    ver = MAKEWORD(1,1);

    WSAStartup(ver,&WSAData); //Windows 要求,只要使用socket,第一步必須調用這個函數
    //初始化socket完成

    /**
     * @brief st
     * params1: 協議族,指定socket使用哪一個協議族
     * params2: 套接字類型,使用協議族中哪一個協議
     * params3: 一般默認填寫0
     */
    SOCKET st = socket(AF_INET,SOCK_DGRAM,0);//建立一個socket
    struct sockaddr_in addr;
    memset(&addr,0,sizeof(addr));//初始化addr

    addr.sin_family = AF_INET;
    addr.sin_port = htons(8090);
    addr.sin_addr.s_addr = inet_addr("192.168.1.102");


    char buf[1024]={0};
    strcpy(buf,"welcome to dhu\n");

    size_t rc = sendto(st,buf,strlen(buf)+1,0,(struct sockaddr *)&addr,sizeof(struct sockaddr));
    closesocket(st);

    WSACleanup();//釋放win socket 的相關的資源
    return 0;
}

3.軟件配置

     由於Linux中的socket是內置的api接口因此我們在運行的時候,幾乎不需要使用鏈接庫。而windows中的socket是外置的api,因此運行之前我們需要配置動態庫,如下所示:

在XXX_pro中添加

LIBS += -lWS2_32

4.運行效果

先運行接收端:./myudp.exe 2

        再運行發送端:./myudp.exe 

接收端的輸出如下:

 recv before...
 buf:welcome to dhu
 src_ip:192.168.1.102
 src_port:57676



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