欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1.简单的建立 UDP 传输

程序员文章站 2022-07-04 18:49:20
...

接收端:

接收信息并打印来源IP和端口

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>//接收端
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
enum {PORT = 8888};//设置端口为8888
int main() 
{
	WSADATA wd;
	WSAStartup(0x0202,&wd);//目前最高是2.2版本
	SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);//两种:UDP,TCP
	if (INVALID_SOCKET == sock) 
	{
		cout << "创建socket套接字(句柄)时出错: " << WSAGetLastError() <<  endl;
		return -1;
	}
	sockaddr_in sa = { 2 };//地址信息结构体:IP和窗口。
	//sockaddr sa = {2}; //旧版的,sockaddr_in是新版的
	sa.sin_port = htons(PORT);
	sa.sin_addr.S_un.S_addr = 0;//inet_add("192.168.1.1");
	int n = bind(sock,(sockaddr *)&sa,sizeof(sa));
	char s[2048];//缓冲区,2048个可任意设置,别太小
	n = recv(sock, s, sizeof(s), 0);
	if (SOCKET_ERROR == n) 
	{
		cout << "接收数据时出错:" << WSAGetLastError() << endl;
		return -1;
	}
	sockaddr_in from;//目的为了获取其地址 具体可查recvfrom函数
	int nLen = sizeof(from);
	while (true)//一直接收

	{
		char s[2048] = {0};
		n = recvfrom(sock,s,sizeof(s),0,(sockaddr *)&from,&nLen);
		s[n] = 0;
		cout << "IP:" << inet_ntoa(from.sin_addr) << "  PORT: " << htons(from.sin_port) << endl;//信息反转输出信息来源IP地址和端口
		cout << s << endl;
	}
}

发送端:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>//发送端
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
enum { PORT = 8887 };//设置端口
int main()
{
	using namespace std;
	WSADATA wd;
	WSAStartup(0x0202, &wd);//目前最高是2.2版本
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);//两种:UDP,TCP
	if (INVALID_SOCKET == sock)
	{
		cout << "创建socket套接字(句柄)时出错: " << WSAGetLastError() << endl;
		return -1;
	}
	sockaddr_in sa = { 2 };//地址信息结构体:IP和窗口。
	sa.sin_port = htons(0);//0代表系统自动找一个可用端口
	sa.sin_addr.S_un.S_addr = 0;//inet_addr("192.168.1.1");
	bind(sock,(sockaddr*)&sa,sizeof(sa));//绑定
	
	sockaddr_in to = {2};
	sa.sin_port = htons(8888);//对方的端口
	char sIP[20], s[2048];//定义IP和发送数据的长度。
	while(true)
	{

		cout << "请输入接收端的IP地址:";
		cin >> sIP;
		cin.get();//读取输入sIP后的一个换行符
		cout << "请输入要发送的内容:";
		//fflush(stdin);
		gets_s(s,sizeof(s));
		//cin.getline(s,2047);
		sa.sin_addr.S_un.S_addr = inet_addr(sIP); //inet_addr("192.168.1.1");//对方的IP地址
		sendto(sock, s, strlen(s), 0, (sockaddr*)&sa, sizeof(sa));//注意这里的(sockaddr*)&sa 强制转换
	}
	return 0;
}