基于UDP的简易通信程序

//客户端
#include<winsock2.h>
#include<stdio.h>
#include<time.h>
#include<string.h>
#pragma comment(lib,"ws2_32.lib")
//BOOL InitWinsock();
void kaisa(char *a, char b, int c)//a为待操作数组,b为移动方向,c为移动位数
{
	switch (b)
	{
	case 'r':
		while (*a)
		{
			*a+=c;
 
			a++;
		}
		break;
	case 'l':
		while (*a)
		{
			*a -= c;
 
 
			a++;
		}
		break;
 
 
	}
 
 
}
int main(void)
{
	SOCKET socket1;
	MEMORYSTATUS mem;
	char neicun[30];
	mem.dwLength = sizeof(mem);
	GlobalMemoryStatus(&mem);
	wsprintf(neicun, "Total memory:%dM", mem.dwTotalPhys / 1024 / 1024 + 1);
	char nameqz[30] = "computer name:";
	TCHAR name[1024];
	DWORD namelen = sizeof(name);
	GetComputerName(name, &namelen);
	strcat(nameqz, name);
	//InitWinsock();
	WSADATA wsa;
	WSAStartup(MAKEWORD(2, 2), &wsa);
	sockaddr_in server;
	int len = sizeof(server);
	time_t t;
	char tmp[32] = { 0 };
	t = time(0);
	strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&t));
	server.sin_family = AF_INET;
	server.sin_port = htons(1000);//用1000端口通信
	server.sin_addr.s_addr = inet_addr("10.128.164.122");//服务端IP
	socket1 = socket(AF_INET, SOCK_DGRAM, 0);//UDP
	char a[64] = "host active-";
	strcat(a, tmp);
	kaisa(a, 'r', 2);
	kaisa(nameqz, 'r', 2);
	kaisa(neicun, 'r', 2);
	sendto(socket1, a, sizeof(a), 0, (sockaddr*)&server, len);
	sendto(socket1, nameqz, sizeof(nameqz), 0, (sockaddr*)&server, len);
	sendto(socket1, neicun, sizeof(neicun), 0, (sockaddr*)&server, len);
	while (1)
	{
		char buffer[1024] = "\0";
		printf("input message\n");
		gets(buffer);
		if (strcmp(buffer, "bye") == 0)
		{
			break;
		}
		kaisa(buffer, 'r', 2);
		if (sendto(socket1, buffer, sizeof(buffer), 0, (sockaddr*)&server, len) != SOCKET_ERROR)
		{
			if (recvfrom(socket1, buffer, sizeof(buffer), 0, (sockaddr*)&server, &len) != SOCKET_ERROR)
			{
				printf("rece from server:%s\n", buffer);
			}
 
		}
 
	}
	closesocket(socket1);
 
 return 0;
}
/*BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested = MAKEWORD(2, 2);
Error = WSAStartup(VersionRequested, &WsaData);
if (Error != 0)
{
return FALSE;
}
else
{
if (LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2)
{
WSACleanup();
return FALSE;
}
}
return TRUE;
}*/
//服务端
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
BOOL InitWinsock();
using namespace std;
void kaisa(char *a, char b, int c)//a为待操作数组,b为移动方向,c为移动位数
{
	switch (b)
	{
	case 'r':
		while (*a)
		{
			*a += c;
 
 
			a++;
		}
		break;
	case 'l':
		while (*a)
		{
			*a -= c;
 
 
			a++;
		}
		break;
 
 
	}
 
 
}
void setcolor(unsigned short zt = 7, unsigned short bj = 0)
{
	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(h, zt + bj * 0x10);
 
}
int main(void)
{
	SOCKET socket1;
	InitWinsock();
	sockaddr_in local, from;
	int fromlen = sizeof(from);
	local.sin_family = AF_INET;
	local.sin_port = htons(1000);//使用1000端口通信
	local.sin_addr.s_addr = INADDR_ANY;
	socket1 = socket(AF_INET, SOCK_DGRAM, 0);//UDP
	bind(socket1, (sockaddr*)&local, sizeof local);//绑定套接字
	while (1)
	{
		char buffer[1024] = "\0";
		printf("waiting for message from others---\n");
		if (recvfrom(socket1, buffer, sizeof(buffer), 0, (sockaddr*)&from, &fromlen) != SOCKET_ERROR)
		{
			kaisa(buffer, 'l', 2);
			setcolor(0x0a, 0x4);//设置字体颜色
			printf("Received datagram from %s--%s\n", inet_ntoa(from.sin_addr), buffer);
			sendto(socket1, "send successful", sizeof("send successful"), 0, (sockaddr*)&from, fromlen);
			setcolor();
		}
 
		Sleep(500);//延迟0.5s
	}
	closesocket(socket1);
  return 0;
}
BOOL InitWinsock()
{
	int Error;
	WORD VersionRequested;
	WSADATA WsaData;
	VersionRequested = MAKEWORD(2, 2);
	Error = WSAStartup(VersionRequested, &WsaData);
	if (Error != 0)
	{
		return FALSE;
	}
	else
	{
		if (LOBYTE(WsaData.wHighVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2)
		{
			WSACleanup();
			return FALSE;
		}
 
	}
 
	return FALSE;
}

程序结构:

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG"
            ],
            "windowsSdkVersion": "10.0.22621.0",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}

tasks.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe 生成活动文件",
            "command": "c:\\Qt\\Tools\\mingw1120_64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-lwsock32"

            ],
            "options": {
                "cwd": "c:\\Qt\\Tools\\mingw1120_64\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值