版权声明:欢迎转载,但是亲请注明转载原文地址,谢谢,么么哒 https://blog.csdn.net/qq_33154343/article/details/81809168
项目实战Small example:C:Socket之UDP编程 [控制台程序]
==================================================================
编辑环境:win10_x64 /VS2015
项目名称:C:Small example:C: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;
}