项目实战Small example:C:Socket之UDP编程 [控制台程序]

版权声明:欢迎转载,但是亲请注明转载原文地址,谢谢,么么哒 https://blog.csdn.net/qq_33154343/article/details/81809168

项目实战Small example:C:Socket之UDP编程 [控制台程序]

==================================================================

编辑环境:win10_x64 /VS2015

项目名称:C:Small exampleC:Socket之udp编程 [控制台程序]

项目简介:Socket的Udp编程,在这里运行了一个win32控制台的程序,一个服务器,一个客户端之间的通信,对socket编程的一个加深入门理解.

项目功能:实现了可以服务器分发多个消息,多个客户及机都可以接收到,但是我在运行结果的之中,有时候很快就达到。有时候需要好久才能能够到达(好几秒钟)。且还都会将消息将其显示出来。

其他:这里面就不在次开虚拟机了,把以前运行的截图拿出来,刚写了TCP的,Udp的原理比之简单,就不细化完全重新写了

==================================================================

项目运行效果:

==================================================================

项目思路分析:

==================================================================

项目主要源码:

服务器端:

// udp_server.cpp : 定义控制台应用程序的入口点。

//
//下面是一个最简单的 UDP 服务器程序 UDPServer. 它运行之后,进入无限循环,监听
//4567 端口到来的 UDP 封包,如果发现就将用户数据以字符串形式打印出来。相关代码如下。

#include "stdafx.h"
#pragma comment(lib, "WS2_32")


int main()
{
	system("title UDP_Server_2018_1_11");

	WSADATA wsaDate;
	WSAStartup(MAKEWORD(2, 2), &wsaDate);

	// 创建套接字
	SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

	if (sockServer == INVALID_SOCKET)
	{
		printf("Failed socket()\n");
	}

	// 填充 sockaddr_in 结构
	SOCKADDR_IN addrServer;
	addrServer.sin_addr.S_un.S_addr = INADDR_ANY;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(3456);

	// 绑定这个套接字到一个本地地址
	if (SOCKET_ERROR == bind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR_IN)))
	{
		printf("Failed bin()\n");
		return 0;
	}

	// 接收数据
	char szRecvBuf[1024] = "";
	SOCKADDR_IN addrClient;
	//SOCKET sockClient;   //*****UDP这里没有这个*****
	int len = sizeof(SOCKADDR_IN);


	while (true)
	{
		int nRecv = recvfrom(sockServer, szRecvBuf, 1024, 0, (SOCKADDR *)&addrClient, &len); //接收返回总的字节数

		if (nRecv > 0)
		{
			szRecvBuf[nRecv] = '\0';
			printf("接收到数据(%s):%s\n", inet_ntoa(addrClient.sin_addr), szRecvBuf);
		}

	}

	//关闭套接字
	closesocket(sockServer);

	//关闭这个库
	WSACleanup();

	return 0;
}

客户端:

// udp_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#pragma comment(lib, "WS2_32")

int main()
{
	// 初始化Winsock库
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	// 创建套节字
	SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);


	// 也可以在这里调用bind函数绑定一个本地地址
	// 否则系统将会自动安排

	// 填写远程地址信息
	SOCKADDR_IN addrClient;
	char szbuf[20] = "";
	printf("请输入服务器的IP:");
	scanf("%s", szbuf);
	addrClient.sin_addr.S_un.S_addr = inet_addr(szbuf);
	addrClient.sin_family = AF_INET;
	addrClient.sin_port = htons(3456);

	// 注意,这里要填写服务器程序所在机器的IP地址  如果你的计算机没有联网,直接使用127.0.0.1即可
	// 发送数据
	char szSendBuf[1024] = "";
	while (true)
	{
		printf(">>");
		scanf("%s", szSendBuf);
		sendto(sockClient, szSendBuf, strlen(szSendBuf) + 1, 0, (SOCKADDR *)&addrClient, sizeof(SOCKADDR_IN));
	}


	closesocket(sockClient);
	WSACleanup();



	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_33154343/article/details/81809168