windows网络编程-echo程序

TCP协议实现

服务端

server.cpp

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
SOCKADDR_IN cAddr = { 0 };
int len = sizeof cAddr;
SOCKET clientSocket[1024];
int count = 0;


void tongxin(int idx) {
	char buff[1024];
	int r;
	while (1) {
		r = recv(clientSocket[idx], buff, 1023, NULL);
		if (r > 0) {
			buff[r] = 0;
			printf("%d:%s\n", idx, buff);
			//广播数据
			for (int i = 0; i < count; i++) {
				send(clientSocket[i], buff, strlen(buff), NULL);
			}
		}
	}
}

int main() {
	//1 请求协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 ||
		HIBYTE(wsaData.wVersion) != 2) {
		printf("请求协议版本失败!\n");
		return -1;
	}
	printf("请求协议成功!\n");
	//2 创建socket
	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (SOCKET_ERROR == serverSocket) {
		printf("创建socket失败!\n");
		WSACleanup();
		return -2;
	}
	printf("创建socket成功!\n");

	//3 创建协议地址族
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;//协议版本
	addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.9");//用自己的ip
	addr.sin_port = htons(10086);//0 - 65535     10000左右
	//os内核 和其他程序  会占用掉一些端口   80  23  

	//4 绑定
	int r = bind(serverSocket, (sockaddr*)&addr, sizeof addr);
	if (-1 == r) {
		printf("bind失败!\n");
		closesocket(serverSocket);
		WSACleanup();
		return -2;
	}
	printf("bind成功!\n");

	//5 监听
	r = listen(serverSocket, 10);
	if (-1 == r) {
		printf("listen失败!\n");
		closesocket(serverSocket);
		WSACleanup();
		return -2;
	}
	printf("listen成功!\n");


	//6 等待客户端连接    阻塞    尾生抱柱
	//客户端协议地址族
	while (1) {
		clientSocket[count] = accept(serverSocket, (sockaddr*)&cAddr, &len);
		if (SOCKET_ERROR == clientSocket[count]) {
			printf("服务器宕机了!\n");
			//8 关闭socket
			closesocket(serverSocket);
			//9 清除协议信息
			WSACleanup();
			return -2;
		}
		printf("有客户端连接到服务器了:%s!\n", inet_ntoa(cAddr.sin_addr));

		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)tongxin,
			(char*)count, NULL, NULL);

		count++;
	}
	return 0;
}

client.cpp

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <graphics.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)


SOCKET clientSocket;
HWND hWnd;
int count = 0;
void jieshou() {
	char recvBuff[1024];
	int r;
	while (1) {
		r = recv(clientSocket, recvBuff, 1023, NULL);
		if (r > 0) {
			recvBuff[r] = 0;
			outtextxy(0, count * 20, recvBuff);
			count++;
		}
	}
}

int main()
{
	hWnd = initgraph(300, 400, SHOWCONSOLE);
	// 1 请求协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
		printf("请求协议版本失败!\n");
		return -1;
	}
	//2 创建socket
	clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (SOCKET_ERROR == clientSocket) {
		printf("创建socket失败!\n");
		WSACleanup();
		return -2;
	}

	printf("创建socket成功!\n");

	//3 获取协议地址族
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;//协议版本
	addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.9");
	addr.sin_port = htons(10086); // 0-65535
	// os内核和其他程序会占用一些端口

	//4 连接服务器
	int r = connect(clientSocket, (sockaddr*)&addr, sizeof addr);
	if (-1 == r) {
		printf("连接服务器失败!\n");
		return -1;
	}
	printf("连接服务器成功!\n");

	//5 通信
	char buff[1024];
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)jieshou, NULL, NULL, NULL);
	while (1) {
		memset(buff, 0, 1024);
		printf("你想说啥:");
		scanf("%s", buff);
		send(clientSocket, buff, strlen(buff), NULL);
	}
}

UDP协议实现

udp_server.cpp

#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main()
{
	// 1 请求协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求协议版本失败!\n");
		return -1;
	}
	// 2 创建socket
	SOCKET server_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (SOCKET_ERROR == server_Socket)
	{
		printf("Failed in socket()!\n");
		WSACleanup();

	}
	//3 创建地址协议族
	SOCKADDR_IN addr = { 0 };
	SOCKADDR_IN clientaddr;
	int client_len = sizeof(clientaddr);
	addr.sin_family = AF_INET; // 协议版本
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addr.sin_port = htons(1314);
	int len = sizeof(addr);
	//4 绑定
	int r = bind(server_Socket, (sockaddr*)&addr, sizeof(addr));
	if (r == -1)
	{
		printf("bind失败!\n");
		closesocket(server_Socket);
		WSACleanup();
		return -2;
	}
	printf("The server bind the port successfully!\n");
	//char send_buff[1024];
	char accept_buff[1024];
	char buffer[1024] = "\0";
	while (1)
	{
		//memset(send_buff, 0, 1024);
		memset(accept_buff, 0, 1024);
		//printf("please send the message what you want:>");
		//scanf("%s", send_buff);


		r = recvfrom(server_Socket, accept_buff, sizeof(accept_buff), 0, (struct sockaddr*)&clientaddr, &client_len);
		printf("%s\n", accept_buff);
		
		
		sendto(server_Socket, accept_buff, strlen(accept_buff)+1, 0, (struct sockaddr*)&clientaddr, client_len);


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

udp_client.cpp

#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main()
{
	// 1 请求协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求协议版本失败!\n");
		return -1;
	}
	// 2 创建socket
	SOCKET server_Socket = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP );
	if (SOCKET_ERROR == server_Socket)
	{
		printf("Failed in socket()!\n");
		WSACleanup();

	}
	//3 创建地址协议族
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET; // 协议版本
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addr.sin_port = htons(1314);
	int len = sizeof(addr);
	
	/*
	int r = bind(server_Socket, (sockaddr*)&addr, sizeof addr);
	if (r == -1)
	{
		printf("bind失败!\n");
		closesocket(server_Socket);
		WSACleanup();
		return -2;
	}
	*/
	char send_buff[1024];
	char accept_buff[1024];
	while (1)
	{
		memset(send_buff, 0, 1024);
		memset(accept_buff, 0, 1024);
		printf("please send the message what you want:>");
		scanf("%s", send_buff);
		

		sendto(server_Socket, send_buff, sizeof(send_buff), 0, (struct sockaddr*)&addr, sizeof(addr));
		
		int result = recvfrom(server_Socket, accept_buff, sizeof(accept_buff), 0, (SOCKADDR *)&addr, &len);
		
		if (result > 0) {
			printf("%s\n", accept_buff);
		}
		
	}
	closesocket(server_Socket);
	WSACleanup();
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的Windows定时关机程序: 1. 打开“开始”菜单,输入“cmd”,然后按“Enter”键打开命令提示符窗口。 2. 在命令提示符窗口中输入“shutdown -s -t 3600”,其中3600表示关机延迟时间,单位为秒。 3. 再次按下“Enter”键,即可完成定时关机程序的设置。 ### 回答2: 要写一个Windows定时关机的程序,可以使用批处理脚本或编程语言来实现。以下是一个使用批处理脚本的示例: 1. 首先,打开文本编辑器(如记事本)并创建一个新的文本文件。 2. 在文本文件中输入以下命令: ```batch @echo off echo 正在设置定时关机... set /p hours=请输入定时时间(小时): set /p minutes=请输入定时时间(分钟): set /p seconds=请输入定时时间(秒): set /a total_time=hours*3600 + minutes*60 + seconds timeout %total_time% shutdown /s /t 0 ``` 3. 将上述文本保存为一个批处理脚本文件,例如shutdown.bat(注意扩展名必须是.bat)。 4. 双击运行该脚本文件,程序将提示您输入定时关机的时间(以小时、分钟和秒为单位)。 5. 输入所需的时间后,计算机将等待指定的时间长度后自动关机。 这个批处理脚本的工作原理是: - 关闭脚本的输出显示(@echo off)。 - 用户被提示输入定时时间(小时、分钟和秒)。 - 输入的时间被转换为秒(total_time = hours * 3600 + minutes * 60 + seconds)。 - 程序等待指定的时间长度(timeout %total_time%)。 - 最后,计算机执行关机命令(shutdown /s /t 0),将计算机关闭。 希望这个简单的批处理脚本可以满足您的Windows定时关机需求。如果您喜欢编程,也可以使用其他编程语言(如Python、C#等)来实现更复杂的定时关机程序。 ### 回答3: 要编写一个Windows定时关机的程序,可以使用C#编程语言和Windows API来实现。下面是一个示例程序的代码: ```csharp using System; using System.Runtime.InteropServices; class Program { [DllImport("user32.dll")] public static extern int MessageBox(int hWnd, string text, string caption, int type); [DllImport("user32.dll")] public static extern bool ExitWindowsEx(uint uFlags, uint dwReason); static void Main(string[] args) { Console.WriteLine("请输入关机时间(单位:分钟):"); int minutes = int.Parse(Console.ReadLine()); int milliseconds = minutes * 60 * 1000; // 获取系统当前时间 DateTime currentTime = DateTime.Now; // 计算关机时间 DateTime shutdownTime = currentTime.AddMilliseconds(milliseconds); // 显示关机时间 Console.WriteLine("将在 {0} 关机", shutdownTime); // 等待定时关机 while (DateTime.Now < shutdownTime) { // 每秒钟检查一次关机时间是否到达 System.Threading.Thread.Sleep(1000); } // 进行关机操作 ExitWindowsEx(0x00000008 | 0x00000001, 0); // 显示关机消息 MessageBox(0, "计算机即将关机", "关机提示", 0); } } ``` 该程序首先会要求用户输入一个关机时间(以分钟为单位),然后通过计算得到将来的关机时间,并且在控制台上显示这个关机时间。程序会在计算机时间达到关机时间之前等待。一旦时间到达,程序会调用Windows API函数进行关机操作,并且在屏幕上显示一个关机提示消息框。 请注意,此示例仅适用于Windows操作系统,并且可能需要管理员权限才能成功执行关机操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值