看得见的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);
}
//}
}