1
누구나 패킷 수정을 위해 LSP를 사용하는 방법에 대한 통찰력을 공유 할 수 있습니까?LSP 패킷 수정
IFS가 아닌 하위 유형을 사용하고 있으며 WSPRecv에 처음 패킷을 입력하는 방법을 알 수 있습니다. 하지만 어떻게 수정합니까? 내 질문은 WSPRecv가 3 번 호출되는 단일 HTTP 응답에 대한 것입니다. ((이 응답의 여러 부분을 수정해야하지만 3 개의 슬라이스가 있으므로 적절하게 수정하기가 어렵습니다.) 그리고 아마도 다른 기계 또는 다른 조건 (예 : 트래픽이 많은 경우)에서는 유일한 WSPRecv 전화가 한 번, 또는 10 번만 호출됩니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까 (NDIS : D를 사용하지 마십시오). 를 증가시켜 버퍼 (lpBuffers-> BUF)?
int WSPAPI
WSPRecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno
)
{
LPWSAOVERLAPPEDPLUS ProviderOverlapped = NULL;
SOCK_INFO *SocketContext = NULL;
int ret = SOCKET_ERROR;
*lpErrno = NO_ERROR;
//
// Find our provider socket corresponding to this one
//
SocketContext = FindAndRefSocketContext(s, lpErrno);
if (NULL == SocketContext)
{
dbgprint("WSPRecv: FindAndRefSocketContext failed!");
goto cleanup;
}
//
// Check for overlapped I/O
//
if (NULL != lpOverlapped)
{
/*bla bla .. not interesting in my case*/
}
else
{
ASSERT(SocketContext->Provider->NextProcTable.lpWSPRecv);
SetBlockingProvider(SocketContext->Provider);
ret = SocketContext->Provider->NextProcTable.lpWSPRecv(
SocketContext->ProviderSocket,
lpBuffers,
dwBufferCount,
lpNumberOfBytesRecvd,
lpFlags,
lpOverlapped,
lpCompletionRoutine,
lpThreadId,
lpErrno);
SetBlockingProvider(NULL);
//is this the place to modify packet length and contents ?
if (strstr(lpBuffers->buf, "var mapObj = null;"))
{
int nLen = strlen(lpBuffers->buf) + 200;
/*CHAR *szNewBuf = new CHAR[];
CHAR *pIndex;
pIndex = strstr(lpBuffers->buf, "var mapObj = null;");
nLen = strlen(strncpy(szNewBuf, lpBuffers->buf, (pIndex - lpBuffers->buf) * sizeof (CHAR)));
nLen = strlen(strncpy(szNewBuf + nLen * sizeof(CHAR), "var com = null;\r\n", 17 * sizeof(CHAR)));
pIndex += 18 * sizeof(CHAR);
nLen = strlen(strncpy(szNewBuf + nLen * sizeof(CHAR), pIndex, 1330 * sizeof (CHAR)));
nLen = strlen(strncpy(szNewBuf + nLen * sizeof(CHAR), "if (com == null)\r\n" \
"com = new ActiveXObject(\"InterCommJS.Gateway\");\r\n" \
"com.lat = latitude;\r\n" \
"com.lon = longitude;\r\n}", 111 * sizeof (CHAR)));
pIndex = strstr(szNewBuf, "Content-Length:");
pIndex += 16 * sizeof(CHAR);
strncpy(pIndex, "1465", 4 * sizeof(CHAR));
lpBuffers->buf = szNewBuf;
lpBuffers->len += 128;*/
}
if (SOCKET_ERROR != ret)
{
SocketContext->BytesRecv += *lpNumberOfBytesRecvd;
}
}
cleanup:
if (NULL != SocketContext)
DerefSocketContext(SocketContext, lpErrno);
return ret;
}
는
제가 생각하기에 제가 생각하기에 타겟 애플리케이션에서 시작한 연결 요청을 잡아서 대상 애플리케이션과 웹 서버 간의 모든 통신을 프록시하는 내 맞춤 소켓 서버로 리디렉션하는 방법은 무엇입니까? 그런 다음 (3 조각) http 응답을 기다렸다가 삼키고 원하는 대상을 보냅니다. 그래도 spcific Http 응답이 완료되었음을 어떻게 알 수 있습니까? – kellogs
전체 코드를 여기에 게시하거나 어딘가에이 작업을 수행하는 데 관심이 있습니다. 고맙습니다. – Para