栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

UDP协议建立socket通信

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UDP协议建立socket通信

第一步:先用VS建立两个项目服务器端项目cli_test.sln

另一个为客户端项目cli_test.sln。

 第二步:在服务器和客户端项目中写入所属程序代码

UDP协议的通信:

       WIN32控制台程序,不过启动的时候不用像TCP一样必须要先启动服务器端,可以先启动客户端,再启动服务器端,可以启动若干个客户端,注意:只能启动一个服务器端。

服务器端代码

//sockServ.cpp
#include 
#include 
#include 
#pragma comment(lib, "WS2_32")  // 链接到WS2_32.lib 
using namespace std;

#define  PORT 5000
//#define  IP_ADDRESS "192.168.1.145"
#define  IP_ADDRESS "127.0.0.1"

int main(int argc, char* argv[])
{
	WSADATA  Ws;
	SOCKET ServerSocket, CientSocket = 0;
	struct sockaddr_in LocalAddr, ClientAddr;//sockaddr_in是TCP/IP使用的数据结构
	int Ret = 0;
	int AddrLen = 0;
	char RecvBuffer[MAX_PATH] = { 0 };
	char SendBuffer[MAX_PATH] = { 0 };

	//Init Windows Socket
	if (WSAStartup(MAKEWORd(2, 2), &Ws) != 0)//socket使用2.2版本的
	{
		cout << "Init Windows Socket Failed::" << GetLastError() << endl;
		return -1;
	}

	//Create Socket
	//第一个参数表示是INTERNET协议簇,第二个参数SOCK_STREAM表示是用TCP协议来进行通信。第三个参数是0表示让系统自动选择
	ServerSocket = socket(AF_INET, SOCK_DGRAM, 0);
	//ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ServerSocket == INVALID_SOCKET)
	{
		cout << "Create Socket Failed::" << GetLastError() << endl;
		return -1;
	}

	LocalAddr.sin_family = AF_INET;//INTERNET协议簇
	//LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
	//LocalAddr.sin_addr.S_un.S_addr = INADDR_ANY;
	LocalAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	LocalAddr.sin_port = htons(PORT);
	memset(LocalAddr.sin_zero, 0x00, 8);

	//Bind Socket
	Ret = bind(ServerSocket, (sockaddr*)&LocalAddr, sizeof(LocalAddr));
	if (SOCKET_ERROR == Ret)
	{
		cout << "Bind Socket Failed::" << GetLastError() << endl;
		return -1;
	}
	int saddrlen = sizeof(sockaddr_in);
	cout << "服务器端启动啦……" << endl;


	while (1)
	{
		memset(RecvBuffer, 0, sizeof(RecvBuffer));
		memset(SendBuffer, 0, sizeof(SendBuffer));
		Ret = recvfrom(ServerSocket, RecvBuffer, MAX_PATH, 0, (sockaddr*)&ClientAddr, &saddrlen);
		if (SOCKET_ERROR == Ret)
		{
			cout << "服务器端接收数据错了!" << endl;
		}
		else
		{
			cout << "我是服务器端,我从客户端 " << inet_ntoa(ClientAddr.sin_addr) <<
				" 接收的数据为:" << RecvBuffer << endl;
			cout << "服务器端向客户端发送如下的数据,快点在此输入吧!:" << endl;
			cin.getline(SendBuffer, sizeof(SendBuffer));
			Ret = sendto(ServerSocket, SendBuffer, (int)strlen(SendBuffer), 0, (sockaddr*)&ClientAddr, saddrlen);
			if (SOCKET_ERROR == Ret)
			{
				cout << "服务器端发送数据错了!" << endl;
			}
		}
	}
	closesocket(ServerSocket);
	closesocket(CientSocket);
	WSACleanup();
	return 0;
}

客户端的程序如下

//sockCli.cpp
#include 
#include 
#include 
using namespace std;
#pragma comment(lib, "WS2_32")  // 链接到WS2_32.lib 

#define  PORT 5000
//#define  IP_ADDRESS "192.168.1.145"
#define  IP_ADDRESS "127.0.0.1"

int main(int argc, char* argv[])
{
	WSADATA  Ws;
	SOCKET CientSocket;
	struct sockaddr_in ServerAddr;
	int Ret = 0;
	int AddrLen = 0;
	HANDLE hThread = NULL;
	char SendBuffer[MAX_PATH];
	char RecvBuffer[MAX_PATH];

	//Init Windows Socket
	if (WSAStartup(MAKEWORd(1, 1), &Ws) != 0)//客户端用的SOCKET库的版本和服务器端一样,就算不一样,也可以正常通信
	{
		cout << "Init Windows Socket Failed::" << GetLastError() << endl;
		return -1;
	}

	//Create Socket
	CientSocket = socket(AF_INET, SOCK_DGRAM, 0);//创建了一个客户端的SOCKET
	if (CientSocket == INVALID_SOCKET)
	{
		cout << "Create Socket Failed::" << GetLastError() << endl;
		return -1;
	}

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
	ServerAddr.sin_port = htons(PORT);
	memset(ServerAddr.sin_zero, 0x00, 8);
	int saddrlen = sizeof(sockaddr_in);


	while (1)
	{
		memset(RecvBuffer, 0, sizeof(RecvBuffer));
		memset(SendBuffer, 0, sizeof(SendBuffer));
		cout << "你是客户端哦,快点给服务器端说点什么吧,好让它知道你的存在!:" << endl;
		cin.getline(SendBuffer, sizeof(SendBuffer));
		Ret = sendto(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0, (sockaddr*)&ServerAddr, saddrlen);
		if (SOCKET_ERROR == Ret)
		{
			cout << "客户端发送数据错了!" << endl;
		}
		else
		{
			Ret = recvfrom(CientSocket, RecvBuffer, MAX_PATH, 0, (sockaddr*)&ServerAddr, &saddrlen);
			if (SOCKET_ERROR == Ret)
			{
				cout << "客户端接收数据错了!" << endl;
			}
			else
			{
				cout << "我是客户端,我从服务器端 " << inet_ntoa(ServerAddr.sin_addr) <<
					" 接收的数据为:" << RecvBuffer << endl;
			}
		}
	}

	closesocket(CientSocket);
	WSACleanup();
	return 0;
}

建立socket通信

 新手小白第一次写,请批评指教!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878992.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号