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; }

 

 

 

 

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

 


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15758727.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示