【发布时间】:2015-05-16 00:51:31
【问题描述】:
如何将 Winsock2 WSASend() 缓冲区转换为字符串?
这是我目前拥有的代码,它只写了很多Icharacters。
int WINAPI Hook_WSASend(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, DWORD a4, LPWSAOVERLAPPED a5, LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)
{
int rv = 0;
char * buf = "";
WSABUF * wb = a1;
for(int i = 0; i == a2; i++){
strcpy_s(buf, wb[i].len, wb[i].buf);
}
fopen_s(&pWSASendLogFile, "C:\\WSASendLog.txt", "a+");
fprintf(pWSASendLogFile, "%s\n", buf);
fclose(pWSASendLogFile);
rv = Real_WSASend(a0,a1,a2,a3,a4,a5,a6);
return rv;
}
正如 Remy Lebeau 所问,我正在添加更多关于我需要实现的目标的信息。
我需要将缓冲区放在字符串中,因为:
我必须在缓冲区中搜索特定字符串,特别是在执行任何操作之前,该字符串必须以
<TalkMsg开头。然后,我必须通过 NamedPipe 发送缓冲区,我已经有我的函数来处理它。
为了更好地解释我在做什么,这是我目前拥有的 Winsock send() 的代码。我必须对 WSASend() 做同样的事情。
int WINAPI Hook_Send(SOCKET s, const char* buf, int len, int flags)
{
/*
fopen_s(&pSendLogFile, "C:\\SendLog.txt", "a+");
fprintf(pSendLogFile, "%s\n", buf);
fclose(pSendLogFile);
*/
curSocket = s;
if(Filtering){
PipeHeader ph;
string p(buf);
if(p.find("<TalkMsg") == 0){
ph.command = 5;
ph.sockid = s;
ph.datasize = len;
if(SendPipeHeader((char*)&ph, sizeof(ph))){
if(SendPipeData(buf, len)){
return len;
}
}
}
}
return Real_Send(s, buf, len, flags);
}
【问题讨论】:
-
buf指向包含空字符串和空终止符的内存区域。也就是说,它“拥有”1 个字节的内存。因此,您的 for 循环一定会在某个时候流泪。
标签: c++ winsock2 packet-capture