看得见的TCP与UDP

看得见的TCP与UDP

基于c语言的socket编程,在Windows下实现不利用WSAAsyncSelect函数实现流畅通信。

如过exe程序运行报错xxx.什么缺失,那肯定是没有安装vs,但是有解决办法

ucrtbased.dll
vcruntime140d.dll
下载好上面的文件后,复制该文件到c盘下面的windows文件夹下的C:\Windows\SysWOW64下即可,如果觉得不保险可以C:\Windows\System32在这个文件夹下也粘贴一份

仅以此博文,留作纪念(项目很短,用时一晚上)

服务器端
连接成功
发送消息

主要是运用socket的各个函数实现(下面是书中对socket流程的描述)

在这里插入图片描述
源程序发出来,免得以后不小心删了
客户端下载
服务端下载
TCP协议代码
客户端:

#include<stdio.h>
#include<stdlib.h>
#include<winsock.h>
#include<windows.h>      
//创建线程
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#include<conio.h>
//#define WM_SOCKET (WM_USER+1)


struct _tagValue
{
	SOCKET sock;
	char *revData;
};
typedef _tagValue Value;

void remessage(void* lpVoid);


int main() {
	Value sValue;
	//创建(获取)窗口句柄

	//HWND hFig = GetActiveWindow();
	//初始化Windows SocketDLL 只有此函数调用成功后才可以调用Windows SocketDLL中的其他函数

	//定义一个用来存储系统传回来的winsock的结构
	WSADATA wsaData;
	//定义应用程序欲使用的Windows Socket版本号
	WORD wVersionRequested = MAKEWORD(2, 2);
	int err = WSAStartup(wVersionRequested, &wsaData);
	
	char ipstr[16];
	//是否输入数据
	char sendnumber;
	char senddata[500] = "对方不想与你说话,并发了一个鄙视!";
	//定义接收数据的变量
	char revData[255];
	//socket
	SOCKET sock;
	if (err == 0)
	{
		printf("入侵系统初始化成功^ ^\n");

		//创建socket连接获取socket句柄
		//AF_INET用于不同机器之间的通信,建立TCPsocket
		 sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

		//绑定窗口
		//printf("不知道对方ip请输入IP");
		//scanf("%s", ipstr);
		if (sock == INVALID_SOCKET)
		{
			printf("木马入侵失败- -!\n");
			return 0;
		}
		else
		{
			printf("木马入侵成功^ ^ !\n");

			//实行绑定
			//用来绑定端口的结构体
			struct sockaddr_in name;
			name.sin_family = AF_INET;
			name.sin_port = htons(8888);//绑定8888端口
			printf("请输入要连接的ip:");
			scanf("%s", ipstr);
			name.sin_addr.s_addr = inet_addr(ipstr);
			int namelen = sizeof(name);
			if (connect(sock, (struct sockaddr*)&name, namelen) == SOCKET_ERROR)
			{
				printf("木马程序与系统绑定失败- -!\n");
				return 0;
			}
			//
			else {
				printf("木马程序与系统绑定成功^ ^\n");
				//开始监听客户端不需要监听
				/*if (listen(sock, 5) == SOCKET_ERROR)
				{
					printf("监听系统失败- - !\n");
					return 0;
				}
				else {*/
					printf("准备执行木马程序...\n");

					//开始接收消息
					//创建流套接字--用于接收客户端消息
					//SOCKET sClient;
					//用来返回新创建的套接字的地址结构
					//struct sockaddr_in addr;
					//指明用来返回新创建的套接字的地址结构长度
					//int addrlen;
					//addrlen = sizeof(addr);
					//sClient = accept(sock, (struct sockaddr*)&addr, &addrlen);
					//没有写WSAAsyncSelect函数
					printf("木马程序过于复杂正在简化木马程序!\n");
					printf("需要输入数据请输入w\n");
					while (1)
					{
						if (sock == INVALID_SOCKET)
						{
							printf("木马程序简化失败- -!");
							continue;
						}
						else
						{
						if (_kbhit())
						{
							//scanf("%d", sendnumber);不用scanf是因为scanf输入要敲回车影响体验
							sendnumber = _getch();
							printf("正在强行入侵!\n");
							printf("%c", sendnumber);
							if (sendnumber == 'w')
							{
								printf("输入你想说的话");
								scanf("%s", senddata);
								send(sock, senddata, strlen(senddata), 0);
							}
						}
							
							接收数据
						sValue.sock = sock;
						sValue.revData = revData;
						//创建子线程
							_beginthread(remessage, 0, (void *)&sValue);
							//printf("获取窗口句柄成功^ ^!");
							//if(recv(sock, revData, 255, 0))
							//{
							//	revData[ret] = 0x00;
							//	printf("木马用户传来消息^ ^!:");
							//	printf(revData);
							//}
							//是否发送数据借用网络工程中的CSMA/CD给我的灵感,发送前检测
							//引入conio.h库的kbhit()函数避免自己不输入的时候还要等待
							
						}
					}
				}

		//	}

		}
	}
	else
	{
		printf("入侵系统初始化失败- -");
		return 0;
	}
	return 0;
}
void remessage(void *lpVoid)
{

	Value* pnInt = (Value*)lpVoid;
	int retn = recv(pnInt->sock, pnInt->revData, 255, 0);
	pnInt->revData[retn] = 0x00;
		printf("木马用户传来消息^ ^!:");
		printf(pnInt->revData);
}

服务端

#include<stdio.h>
#include<stdlib.h>
#include<winsock.h>
#include<windows.h>   
//创建线程
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#include<conio.h>

struct _tagValue
{
	SOCKET sock;
	char* revData;
};
typedef _tagValue Value;

void remessage(void* lpVoid);

//#define WM_SOCKET (WM_USER+1)
int main() {
	//创建(获取)窗口句柄

	//HWND hFig = GetActiveWindow();
	//初始化Windows SocketDLL 只有此函数调用成功后才可以调用Windows SocketDLL中的其他函数
	Value sValue;
	//定义一个用来存储系统传回来的winsock的结构
	WSADATA wsaData;
	//定义应用程序欲使用的Windows Socket版本号
	WORD wVersionRequested = MAKEWORD(2, 2);
	int err = WSAStartup(wVersionRequested, &wsaData);
	//服务器端不需要装入ip
	// char ipstr[16];
	//是否输入数据
	char sendnumber;
	char senddata[500] = "对方不想与你说话,并发了一个鄙视!";
	//定义接收数据的变量
	char revData[255];
	if (err == 0)
	{
		printf("入侵系统初始化成功^ ^\n");

		//创建socket连接获取socket句柄
		//AF_INET用于不同机器之间的通信,建立TCPsocket
		SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
		//绑定窗口
		//printf("不知道对方ip请输入IP");
		//scanf("%s", ipstr);
		if (sock == INVALID_SOCKET)
		{
			printf("木马入侵失败- -!\n");
			return 0;
		}
		else
		{
			printf("木马入侵成功^ ^ !\n");

			//实行绑定
			//用来绑定端口的结构体
			struct sockaddr_in name;
			name.sin_family = AF_INET;
			name.sin_port = htons(8888);//绑定8888端口
			name.sin_addr.s_addr = htonl(INADDR_ANY);
			int namelen = sizeof(name);
			if (bind(sock, (struct sockaddr*)&name, namelen) == SOCKET_ERROR)
			{
				printf("木马程序与系统绑定失败- -!\n");

			}
			//
			else {
				printf("木马程序与系统绑定成功^ ^\n");
				//udp连接不需要监听
				//开始监听
				if (listen(sock, 5) == SOCKET_ERROR)
				{
					printf("监听系统失败- - !\n");
					return 0;
				}
			else {


					printf("准备执行木马程序...\n");

					//开始接收消息
					//创建流套接字--用于接收客户端消息
					SOCKET sClient;
					//用来返回新创建的套接字的地址结构
					struct sockaddr_in addr;
					//指明用来返回新创建的套接字的地址结构长度
					int addrlen;
					addrlen = sizeof(addr);
					sClient = accept(sock, (struct sockaddr*)&addr, &addrlen);
					printf("木马用户%s请求连接成功 \r\n", inet_ntoa(addr.sin_addr));
					//没有写WSAAsyncSelect函数
					printf("木马程序过于复杂正在简化木马程序!\n");
					printf("需要输入数据请输入w");
					while (1)
					{
						if (sClient == INVALID_SOCKET)
						{
							printf("木马程序简化失败- -\n!");
							printf("对方已退出!\n");
							continue;
						}
						else
						{
							
							sValue.sock = sClient;
							sValue.revData = revData;
							//创建子线程
							_beginthread(remessage, 0, (void*)&sValue);
							
								//是否发送数据借用网络工程中的CSMA/CD给我的灵感,发送前检测
								//引入conio.h库的kbhit()函数避免自己不输入的时候还要等待
								if (_kbhit())
								{
									//scanf("%d", sendnumber);不用scanf是因为scanf输入要敲回车影响体验

									
									sendnumber = _getch();
									if (sendnumber == 'w')
									{
										printf("正在将木马程序进行网络传递--IP:%s \r\n", inet_ntoa(addr.sin_addr));
										printf("输入你想说的话");
										scanf("%s", senddata);
										send(sClient, senddata, strlen(senddata), 0);
									}
								}
								
						}
					}
				}

			}

		}
	}
	else
	{
		printf("入侵系统初始化失败- -");
		return 0;
	}
	return 0;
}

//消息函数
void remessage(void* lpVoid)
{
	
	Value* pnInt = (Value*)lpVoid;
	int retn = recv(pnInt->sock, pnInt->revData, 255, 0);
	if (retn > 0)
	{
		pnInt->revData[retn] = 0x00;
		printf("木马用户传来消息^ ^!:\n");
		printf(pnInt->revData);
	}
}

UDP客户端

#include<stdio.h>
#include<stdlib.h>
#include<winsock.h>
#include<windows.h>   
//创建线程
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#include<conio.h>

struct _tagValue
{
	SOCKET sock;
	char* revData;
	sockaddr_in r;
};
typedef _tagValue Value;

void remessage(void* lpVoid);

//#define WM_SOCKET (WM_USER+1)
int main() {
	//创建(获取)窗口句柄

	//HWND hFig = GetActiveWindow();
	//初始化Windows SocketDLL 只有此函数调用成功后才可以调用Windows SocketDLL中的其他函数
	Value sValue;
	//定义一个用来存储系统传回来的winsock的结构
	WSADATA wsaData;
	//定义应用程序欲使用的Windows Socket版本号
	WORD wVersionRequested = MAKEWORD(2, 2);
	int err = WSAStartup(wVersionRequested, &wsaData);
	//服务端不需要需要装入ip
	 char ipstr[16];
	//是否输入数据
	char sendnumber;
	char senddata[500] = "对方不想与你说话,并发了一个鄙视!";
	//定义接收数据的变量
	char revData[255];
	if (err == 0)
	{
		printf("入侵系统初始化成功^ ^\n");

		//创建socket连接获取socket句柄
		//AF_INET用于不同机器之间的通信,建立TCPsocket
		SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
		//绑定窗口
		//printf("不知道对方ip请输入IP");
		//scanf("%s", ipstr);
		if (sock == INVALID_SOCKET)
		{
			printf("木马入侵失败- -!\n");
			return 0;
		}
		else
		{
			printf("木马入侵成功^ ^ !\n");

			//实行绑定
			//用来绑定端口的结构体
			struct sockaddr_in name;
			name.sin_family = AF_INET;
			name.sin_port = htons(8888);//绑定8888端口
			printf("请输入需要入侵的ip:");
			scanf("%s",ipstr);
			name.sin_addr.s_addr = inet_addr(ipstr);
			int namelen = sizeof(name);
			//if (bind(sock, (struct sockaddr*)&name, namelen) == SOCKET_ERROR)
			//{
			//	printf("木马程序与系统绑定失败- -!\n");

			//}
			
			//else {
				printf("木马程序与系统绑定成功^ ^\n");
				//udp连接不需要监听
				//开始监听
				/*if (listen(sock, 5) == SOCKET_ERROR)
				{
					printf("监听系统失败- - !\n");
					return 0;
				}
				else {*/


				printf("准备执行木马程序...\n");

				//开始接收消息
				//创建流套接字--用于接收客户端消息
				//UDP不需要创建新socket来接受客户端的消息也没有accept函数
				//SOCKET sClient;
				//用来返回新创建的套接字的地址结构
				//struct sockaddr_in addr;
				//指明用来返回新创建的套接字的地址结构长度
				//int addrlen;
				//addrlen = sizeof(addr);
				//sClient = accept(sock, (struct sockaddr*)&addr, &addrlen);
				//没有写WSAAsyncSelect函数
				printf("木马程序过于复杂正在简化木马程序!\n");
				printf("需要输入数据请输入w\n");
				while (1)
				{
					/*if (sClient == INVALID_SOCKET)
					{
						printf("木马程序简化失败- -!");
						continue;
					}
					else
					{*/

					//sValue.sock = sock;
					//sValue.revData = revData;

					//创建子线程
					//_beginthread(remessage, 0, (void*)&sValue);
				//UDP不需要创建子进程来接收信息
					if (_kbhit())
					{
						//scanf("%d", sendnumber);不用scanf是因为scanf输入要敲回车影响体验
						sendnumber = _getch();
						if (sendnumber == 'w')
						{
							printf("输入你想说的话");
							scanf("%s", senddata);
							sendto(sock, senddata, strlen(senddata), 0, (sockaddr*)&name, namelen);
						}
					}
			/*		int ret = recvfrom(sock, revData, 255, 0, (sockaddr*)&addr, &addrlen);
					if (ret > 0)
					{
						revData[ret] = 0x00;
						printf("接受到一个连接:%s \r\n", inet_ntoa(addr.sin_addr));
						printf(revData);
					}*/
					//是否发送数据借用网络工程中的CSMA/CD给我的灵感,发送前检测
					//引入conio.h库的kbhit()函数避免自己不输入的时候还要等待

						//创建子线程用来发送消息
					sValue.sock = sock;
					sValue.revData = revData;
					sValue.r = name;
					_beginthread(remessage, 0, (void*)&sValue);
					
				}
				//	}
				//}

			//}

		}
	}
	else
	{
		printf("入侵系统初始化失败- -");
		return 0;
	}
	return 0;
}

//消息函数
void remessage(void* lpVoid)
{

	Value* pnInt = (Value*)lpVoid;
	int len = sizeof(pnInt->r);
	int ret = recvfrom(pnInt->sock, pnInt->revData, 255, 0, (sockaddr*)&pnInt->r, &len);
	if (ret > 0)
	{
		pnInt->revData[ret] = 0x00;
		printf("接受到一个连接:%s \r\n", inet_ntoa(pnInt->r.sin_addr));
		printf(pnInt->revData);
	}
}

服务器端

#include<stdio.h>
#include<stdlib.h>
#include<winsock.h>
#include<windows.h>   
//创建线程
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#include<conio.h>

struct _tagValue
{
	SOCKET sock;
	char* revData;
	sockaddr_in r;
};
typedef _tagValue Value;

void remessage(void* lpVoid);

//#define WM_SOCKET (WM_USER+1)
int main() {
	//创建(获取)窗口句柄

	//HWND hFig = GetActiveWindow();
	//初始化Windows SocketDLL 只有此函数调用成功后才可以调用Windows SocketDLL中的其他函数
	Value sValue;
	//定义一个用来存储系统传回来的winsock的结构
	WSADATA wsaData;
	//定义应用程序欲使用的Windows Socket版本号
	WORD wVersionRequested = MAKEWORD(2, 2);
	int err = WSAStartup(wVersionRequested, &wsaData);
	//服务端不需要需要装入ip
	// char ipstr[16];
	//是否输入数据
	//char sendnumber;
	//char senddata[500] = "对方不想与你说话,并发了一个鄙视!";
	//定义接收数据的变量
	char revData[255];
	if (err == 0)
	{
		printf("入侵系统初始化成功^ ^\n");

		//创建socket连接获取socket句柄
		//AF_INET用于不同机器之间的通信,建立TCPsocket
		SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
		//绑定窗口
		//printf("不知道对方ip请输入IP");
		//scanf("%s", ipstr);
		if (sock == INVALID_SOCKET)
		{
			printf("木马入侵失败- -!\n");
			return 0;
		}
		else
		{
			printf("木马入侵成功^ ^ !\n");

			//实行绑定
			//用来绑定端口的结构体
			struct sockaddr_in name;
			name.sin_family = AF_INET;
			name.sin_port = htons(8888);//绑定8888端口
			name.sin_addr.s_addr = INADDR_ANY;
			int namelen = sizeof(name);
			if (bind(sock, (struct sockaddr*)&name, namelen) == SOCKET_ERROR)
			{
				printf("木马程序与系统绑定失败- -!\n");

			}
			//
			else {
				printf("木马程序与系统绑定成功^ ^\n");
				//udp连接不需要监听
				//开始监听
				/*if (listen(sock, 5) == SOCKET_ERROR)
				{
					printf("监听系统失败- - !\n");
					return 0;
				}
				else {*/


					printf("准备执行木马程序...\n");

					//开始接收消息
					//创建流套接字--用于接收客户端消息
					//UDP不需要创建新socket来接受客户端的消息也没有accept函数
					//SOCKET sClient;
					//用来返回新创建的套接字的地址结构
					struct sockaddr_in addr;
					//指明用来返回新创建的套接字的地址结构长度
					int addrlen;
					addrlen = sizeof(addr);
					//sClient = accept(sock, (struct sockaddr*)&addr, &addrlen);
					//没有写WSAAsyncSelect函数
					printf("木马程序过于复杂正在简化木马程序!\n");
					printf("需要输入数据请输入w(UDP服务器端需要先接收数据)\n");
					while (1)
					{
						/*if (sClient == INVALID_SOCKET)
						{
							printf("木马程序简化失败- -!");
							continue;
						}
						else
						{*/

							//sValue.sock = sock;
							//sValue.revData = revData;
					
							//创建子线程
							//_beginthread(remessage, 0, (void*)&sValue);
						//UDP不需要创建子进程来接收信息
							int ret = recvfrom(sock, revData, 255, 0, (sockaddr*)&addr, &addrlen);
						        if (ret > 0)
							         {
							            revData[ret] = 0x00;
							           printf("接受到一个连接:%s \r\n", inet_ntoa(addr.sin_addr));
							           printf(revData);
							        }
							//是否发送数据借用网络工程中的CSMA/CD给我的灵感,发送前检测
							//引入conio.h库的kbhit()函数避免自己不输入的时候还要等待

								//创建子线程用来发送消息

							sValue.sock = sock;
							sValue.revData = revData;
							sValue.r = addr;
							_beginthread(remessage, 0, (void*)&sValue);
							

						}
				//	}
				//}

			}

		}
	}
	else
	{
		printf("入侵系统初始化失败- -");
		return 0;
	}
	return 0;
}

//消息函数
void remessage(void* lpVoid)
{

	Value* pnInt = (Value*)lpVoid;
	int len = sizeof(pnInt->r);
	//是否输入数据
	char sendnumber;
	char senddata[500] = "对方不想与你说话,并发了一个鄙视!";
	//if (_kbhit())
	//{
		//scanf("%d", sendnumber);不用scanf是因为scanf输入要敲回车影响体验
		sendnumber = _getch();
		if (sendnumber == 'w')
		{
			printf("输入你想说的话");
			scanf("%s", senddata);
			sendto(pnInt->sock, senddata, strlen(senddata), 0, (sockaddr*)&pnInt->r, len);
		}
	//}
}

UDP的源程序下载

客户端
服务端

个人在局域网测试是完全没问题的,公网ip下也测试成功
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阁下莫非东西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值