Windows下的网络编程——2、Socket(UDP)

UDP模型

一、UDP与TCP通信方法对比

 

 

 

二、

获取错误码

WSAGetLastError

 

三、所用的一些函数

1、sendto()

int sendto(

    int sockfd,           

    const void *msg,       //缓冲区

    int len,               //缓冲区长度//

    unsigned int flags,    //调用操作方式,一般置0,现在还不懂

    const struct sockaddr *to, //发送给..//

    int tolen

);

 

2、recvfrom

int recvfrom(

    int sockfd,

    void *buf,

    int len,

    unsigned int lags,

    struct sockaddr *from,

    int *fromlen

); 

 

 

四、对比TCP协议

1、UDP下客户机只需要sendto函数就能给服务机发送消息

TCP需要connect函数与send函数

 

2、UDP服务机下套接字绑定服务地址后通过recvfrom函数就能完成接收,且不用监听

TCP需要listen函数与accept函数与recv函数

 

 五、代码:

1、客户端:

// UDP_Client.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
    SOCKET hClient;//定义套接字//
    char  buff[255];
    WSAData wsaData;
        WORD wVerSion = MAKEWORD(2,2);//版本号//
    int nRet;
    if(nRet = WSAStartup(wVerSion,&wsaData) != 0)
    {
        printf("WSAStartup 执行失败\n");
        return 0;
    }

    hClient =  socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//创建套接字//
    if(hClient == INVALID_SOCKET)
    {
        WSACleanup();    // 应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
        printf("socket 失败\n");
        return 0;
    }    
    //绑定//
    //填写IP和端口//    
    sockaddr_in sSerAddr;
    int nSerAddrLen;
    sSerAddr.sin_family  = AF_INET;
    sSerAddr.sin_port = htons(8888);
    sSerAddr.sin_addr.s_addr = inet_addr("192.168.0.109");
    nSerAddrLen = sizeof(sSerAddr);
    
    strcpy(buff,"Hello\n");
    nRet = sendto(hClient,buff,255,0,(LPSOCKADDR)&sSerAddr,nSerAddrLen);
    
    closesocket(hClient);
    WSACleanup();
    return 0;
}

2、服务端:

// UDP_Server.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])
{
    SOCKET hServer;//定义套接字//
        WORD wVerSion = MAKEWORD(2,2);//版本号//
    char  buff[255];
    WSAData wsaData;
    int nRet;
    if(nRet = WSAStartup(wVerSion,&wsaData) != 0)
    {
        printf("WSAStartup 执行失败\n");
        return 0;
    }

    hServer =  socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//创建套接字//
    if(hServer == INVALID_SOCKET)
    {
        WSACleanup();
        printf("socket 失败\n");
        return 0;
    }
    //绑定//
    sockaddr_in sSerAddr;
    int nSerAddrLen;
    sSerAddr.sin_family  = AF_INET;
    sSerAddr.sin_port = htons(8888);
    sSerAddr.sin_addr.s_addr = htonl(ADDR_ANY);
    nSerAddrLen = sizeof(sSerAddr);
    nRet = bind(hServer,(sockaddr*)&sSerAddr,nSerAddrLen);

    if(nRet == SOCKET_ERROR)
    {
        printf("socket绑定失败\n");
        closesocket(hServer);
        WSACleanup();        // 应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
        return 0;
    }
    //不用监听,不用accept,直接读取数据//
    //不过函数变了//
    sockaddr_in sClientAddr;
    int nClientAddrLen;

    memset(buff,0,255);
    nClientAddrLen = sizeof(sClientAddr);    
    nRet = recvfrom(hServer,buff,255,0,(LPSOCKADDR)&sClientAddr,&nClientAddrLen);//返回接受的实际长度//
    if(nRet > 0)
    {
        buff[nRet] = '\0';
        printf(buff);    //printf的一个小技巧,可以直接输出字符串//
    } 
    closesocket(hServer);
    WSACleanup();
    return 0;
}

 

 

 

 

 因为图方便,我只接受/传送了一个数据....

 

posted @ 2022-01-02 23:27  TLSN  阅读(132)  评论(0)    收藏  举报