Winsock編程基礎2(UDP流程)

UDP用戶數據報協議
服務器端
  <1 建立套接字(socket)
  <2 綁定IP地址和端口(bind)
  <3 收發數據(sendto, recvfrom)
  <4 關閉鏈接(closesocket)
客戶端
  <1 建立套接字(socket)
  <2 收發數據(sendto, recvfrom)
  <3 關閉鏈接(closesocket)
int sendto(
    SOCKET s,    //用來發送數據的套接字
    const char FAR *buf,    //指向發送數據的緩衝區
    int len,    //要發送數據長度
    int flags,    //通常指定0
    const struct sockaddr *to,    //指向一個包含目標地址和端口號的sockaddr_in結構
    int toLen    //結構大小
);
int recvfrom(SOCKET s, char *FAR buf, int len, int flags, struct sockaddr FAR *from, int FAR* fromLen)
簡單實例
    服務器端
#include <iostream>
#include <stdio.h>

#include "InitSock.h"

using namespace std;
int main(void)
{
    CInitSock initSock;
    //建立套接字
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        cout << "Failed socke()" << endl;
        return 0;
    }

    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(4567);
    addr.sin_addr.S_un.S_addr = INADDR_ANY;

    //綁定套接字到一個本地地址
    if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
    {
        cout << "Failed bind()" << endl;
        return 0;
    }

    //接收數據
    char buf[1024];
    sockaddr_in clientAddr;
    int nLen = sizeof(addr);
    while (TRUE)
    {
        int nRecv = recvfrom(s, buf, 1024, 0, (sockaddr*)&clientAddr, &nLen);
        if (nRecv > 0)
        {
            buf[nRecv] = '\0';
            cout << "接收到數據" << inet_ntoa(clientAddr.sin_addr) << ": " << buf << endl;
        }
    }

    //關閉套接字
    closesocket(s);
    return 0;
}
    客戶端
#include <iostream>
#include <stdio.h>

#include "InitSock.h"

using namespace std;
int main(void)
{
    CInitSock initSock;
    //建立套接字
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        cout << "Failed socke()" << endl;
        return 0;
    }
    //建立套接字以後若是首先sendto能夠不綁定
    //若首先recvfrom則須要綁定

    //填寫遠程地址信息
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(4567);
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    //發送數據
    char szText[] = "UDP Server Demo\r\n";
    sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
    closesocket(s);

    cout << "數據已發送" << endl;
    getchar();
    return 0;
}
相關文章
相關標籤/搜索