Winsock編程_第2篇_UDP套接字編程

        最近受一位編程牛人的影響,本身決定從今天開始將Windows Sockets 網絡編程的內容以日誌的形式記錄下來,其一是爲本身保留一份筆記,其二是加深本身對winsock編程的理解,其三是和喜歡代碼的朋友一塊兒分享編程的樂趣,我不知道本身能不能一直堅持下去,可是我會盡本身最大的努力作到每週更新1-2篇,在此也但願更多的朋友爲我提出建議,若是你也喜歡編程,在閱讀代碼的過程當中有什麼疑問,請與本人進行探討。
        每次我會以一段程序代碼的分析來闡述其中的知識點,由於閱讀大量優秀代碼能夠快速提高自身的編程水平。
UDP套接字編程:

首先介紹UDP套接字服務端和客戶端的工做模式,如圖所示: 編程


//recvfrom()函數聲明以下
int recvfrom (
    SOCKET            s,    //套接字
    char FAR *        buf,    //接收數據緩衝區
    int            len,    //接收數據緩衝區大小
    int            flags,    //該參數影響recvfrom()函數的行爲
    struct sockaddr FAR*    from,    //返回發送數據主機地址
    int FAR *        fromlen    //地址長度
);
//調用成功返回接收數據字節數,失敗則返回SOCKET_ERROR


//sendto()函數聲明以下
int    sendto(
    SOCKET                s,    
    const char FAR *        buf,
    int                len,
    int                flags,    //該參數影響sendto()函數的行爲
    const struct sockaddr    FAR *    to,    //接收數據地址
    int                tolen    //接收數據地址長度
);
//調用成功返回接收數據字節數,失敗則返回SOCKET_ERROR

//flags:該參數可爲:0表示函數無特殊行爲;
//                             MSG_DONTROUTE要求傳輸層不要將數據路由出去;
//                             MSG_OOB預示該數據應該被帶外發送


Server Code: 服務器

// server.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#define  BUF_SZIE     64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[])
{
    
    WSADATA            wsd;            //WSADATA變量
    SOCKET            s;                //套接字
    SOCKADDR_IN        servAddr;        //服務器地址
    char            buf[BUF_SZIE];    //接收數據緩衝區
    
    //初始化套結字動態庫
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
        printf("初始化套接字動態庫失敗!\n");
        return 1;
    }
    
    //建立套接字
    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s == INVALID_SOCKET)
    {
        printf("建立套接字失敗,失敗緣由; %d\n", WSAGetLastError());
        WSACleanup();//釋放套接字資源
        return 1;
    }
    //服務器地址
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons((short)2012);            //端口
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);    //IP
    
    //綁定
    if (bind(s, (SOCKADDR *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
    {
        printf("綁定失敗,失敗緣由: %d\n", WSAGetLastError());
        closesocket(s);    //關閉套接字
        WSACleanup();    //釋放套接字資源
        return 1;
    }    
    
    //接收數據
    SOCKADDR_IN clientAddr;
    int nClientLen = sizeof(clientAddr);
    ZeroMemory(buf, BUF_SZIE);
    if(recvfrom(s, buf, BUF_SZIE, 0, (SOCKADDR*)&clientAddr, &nClientLen) == SOCKET_ERROR)
    {
        printf("接收數據失敗,失敗緣由: %d\n", WSAGetLastError());
        closesocket(s);    //關閉套接字
        WSACleanup();    //釋放套接字資源
        return 1;
    }    

    printf("%s\n", buf);//輸出
    
    closesocket(s);        //關閉套接字
    WSACleanup();        //釋放套接字資源
    return 0;
}
Client Code:
// Client.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#define  BUF_SZIE     64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[])
{
    
    WSADATA        wsd;                //WSADATA變量
    SOCKET         s;                //套接字
    SOCKADDR_IN    servAddr;        //服務器地址
    char            buf[BUF_SZIE];    //發送數據緩衝區
    
    //初始化套結字動態庫
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
        printf("初始化套接字動態庫失敗!\n");
        return 1;
    }

    //建立套接字
    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s == INVALID_SOCKET)
    {
        printf("建立套接字失敗,錯誤代碼; %d\n", WSAGetLastError());
        WSACleanup();//釋放套接字資源
        return 1;
    }
    
    //賦值「2012年12月17日」
    ZeroMemory(buf, BUF_SZIE);
    strcpy(buf, "2012年12月17日");
    
    //服務器地址
    servAddr.sin_family =AF_INET;
    servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servAddr.sin_port = htons((short)2012);
    int    nServAddlen  = sizeof(servAddr);

    //發送數據
    if(sendto(s, buf, BUF_SZIE, 0, (SOCKADDR*)&servAddr, nServAddlen) == SOCKET_ERROR)
    {
        printf("發送數據失敗,錯誤代碼: %d\n", WSAGetLastError());
        closesocket(s);    //關閉套接字
        WSACleanup();    //釋放套接字資源
        return 1;
    }
    
    closesocket(s);        //關閉套接字      
    WSACleanup();        //釋放套接字資源
    return 0;
}

程序運行結果: 網絡

UDP相對於TCP簡單一些,欲瞭解更加詳細內容請查閱百度,爲了更好地理解兩者的區別與聯繫請對照第一篇TCP程序示例。 socket

轉載請註明出處,謝謝!
原文地址:http://http://www.foregoer.com 函數

相關文章
相關標籤/搜索