UDP协议建立socket通信

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

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

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

UDP协议的通信:

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

服务器端代码

//sockServ.cpp
#include <iostream>
#include <Windows.h>
#include <winsock.h>
#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 <iostream>
#include <Windows.h>
#include <winsock.h>
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通信

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值