MFC/Windows中UDP和TCP通信详解

UDP通信中步骤:

  1. 创建绑定到特定传输服务提供程序的套接字:socket函数
  2. 设置套接字选项:setsockopt函数
  3. 设置套接字对应IP地址和端口号
  4. 将本地地址与套接字相关联
  5. 发送/接收数据(send/recv或sendto/recvfrom)
    具体使用方法:
    注意:使用前调用InitWSA_StartUp()函数,初始化winsock,启动winsock的DLL使用
    最后需要调用WSACleanup()函数终止使用Winsock的DLL
cpp 复制代码
UINT32 InitWSA_StartUp()
{
WSADATA wsaData;
int iResult = 0; 
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        return 1;
    }
}

UDP创建连接

cpp 复制代码
UINT32 UDP_CreateSocket(char *FromIP,int LocalIP,char *ToIP,int ToPort)
{
	SOCKET m_UdpSocket;//一般放全局变量便于使用
	SOCKADDR_IN m_UdpSocketAddr;//全局变量,以网络字节顺序表示,客户端
	SOCKADDR_IN m_UdpSocketServer;//全局变量,以网络字节顺序表示,服务端
	int Err = 0;
	if(m_UdpSocket)
	{
		closesocket(m_UdpSocket);
		m_UdpSocket = 0;
	}
	m_UdpSocket = socket(AF_INET,SOCK_DGRAM,0);//AF_INET:Internet协议版本4地址系列,AF_INET6:IP6地址系列,AF_BTH:蓝牙地址系列;SOCK_DGRAM:支持数据报的套接字类型,此套接字类型对Internet系列(AF_INET/AF_INET6)使用用户数据报协议(UDP),SOCK_STREAM:一种套接字类型,通过OOB数据传输机制提供排序的、可靠的双向、基于连接的字节流,此套接字类型对(AF_INET/AF_INET6)使用传输控制协议(TCP);0表示调用方不希望指定协议
	bool Opt = true;
	setsockopt(m_UdpSocket,SOL_SOCKET,SO_BROADCAST,(char *)&Opt,sizeof(Opt));//SOL_SOCKET表示定义选项的水平级别;SO_BROADCAST表示配置用于发送广播数据的套接字,Opt为指向指定所请求选项值的缓冲区的指针。个人理解是表示启用布尔选项
	timeval timeout;
	timeout.tv_sec = 2;
	timeout.tv_usec = 0;
	setsockopt(m_UdpSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));//SO_RCVTIMEO:设置阻止接收调用的超时,ms为单位
	m_UdpSocketAddr.sinfimily = AF_INET;
	m_UdpSocketAddr.sin_addr.S_un.S_addr = inet_addr(ToIP);//S_un结构是将点分十进制的IP转换为一个u_long类型的数据赋给S_addr;
	m_UdpSocketAddr.sin_port = htons(ToPort);//
	
	m_UdpSocketServer.sinfimily = AF_INET;
	m_UdpSocketServer.sin_addr.S_un.S_addr = htol(INADDR_ANY);//S_un结构是将点分十进制的IP转换为一个u_long类型的数据赋给S_addr;
	m_UdpSocketServer.sin_port = htons(LocalPort);//
	Err = bind(m_UdpSocket,(SOCKADDR*)&m_UdpSocketServer,sizeof(SOCKADDR));
	return Err;
}

TCP创建连接

cpp 复制代码
int TCP_Open(HANDLE *Handle,void *ToIP,int IPFlag/*0:字符,1:二进制*/,int ToPort)
{
	float TempIP = 0.0;
	SOCKET *Sock = (SOCKET*)Handle;
	*Sock = socket(PF_INET,SOCK_STREAM,0);//同AF_INET
	SOCKADDR_IN AddrSrc;
	AddrSrc.sin.family = AF_INET;
	if(!IPFlag)
		AddrSrc.sin_addr.S_un.S_addr = inet_addr((char *)ToIP);
		else
		{
			TempIP = toFloat((float*)ToIP);//转换大小端
			memcpy(&AddrSrc.sin_addr.S_un.s_un_b,&TempIP,4);
		}
AddrSrc.sin_port = htons(ToPort);
int Err = 0;
if(connect(*Sock,(SOCKADDR*)&AddrSrc,sizeof(SOCKADDR))== SOCKET_ERROR)//connect函数用于创建到指定目标的连接
{
	Err = GetLastError();
	closesocket(*SOCK);
	return -1;
}
return -1;

}

官方函数解释及其例程地址

相关推荐
博客18008 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
qq_3692243313 天前
Windows全系通用!ntdll.dll文件丢失、报错、闪退问题的完整排查与修复教程
windows·dll·dll修复·dll丢失·dll错误
阿米亚波13 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
酉鬼女又兒14 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
caimouse14 天前
Reactos 第 10 章 网络操作 — 10.3.1 NIC驱动
网络·windows
初圣魔门首席弟子14 天前
Node.js 详细介绍(知识库版)
windows·qt·node.js·知识库
CHENG-JustDoIt14 天前
AI工具 | 爆火开源项目Odysseus AI 工作台:从项目介绍、部署情况及其使用等多方位分析指南(含详细步骤)
大数据·人工智能·windows·python·ai·开源·github
kingbal14 天前
Windows:flutter环境搭建
windows·flutter
未若君雅裁14 天前
Python 数据容器详解,list、tuple、str、set、dict 到底怎么选
windows·python·list
CodeKwang14 天前
Windows 环境 OCCT 8.0 编译构建及与 Qt6 项目集成
windows·qt·opencascade