参数不一置问题

swords_man 2005-04-06 03:26:56
/创建两个线程进行数据转发
hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(LPVOID)sock,0,&dwThreadID);
hThreadT2C=CreateThread(NULL,0,TCPDataT2C,(LPVOID)sock,0,&dwThreadID);

DWORD WINAPI TCPDataT2C(SOCKET* sock);
DWORD WINAPI TCPDataC2T(SOCKET* sock);

由于,(LPVOID)sock和(SOCKET* sock); 的参数不一置,编译器会提示有错误,请问怎么改才能使他们一致???


程序代码如下:

/**********************************************************************

Module Name:AgentGateWay.c
Date:2001/4/15
CopyRight(c) eyas
说明:端口重定向工具,在网关上运行,把端口重定向到内网的IP、PORT,
就可以进入内网了
sock[0]==>sClient sock[1]==>sTarget
**********************************************************************/
#include
#include
#include "TCPDataRedird.c"
#define TargetIP TEXT("192.168.1.3")
#define TargetPort (int)3389
#define ListenPort (int)3389//监听端口

#pragma comment(lib,"ws2_32.lib")

int main()
{
WSADATA wsd;
SOCKET sListen=INVALID_SOCKET,//本机监听的socket
sock[2];
struct sockaddr_in Local,Client,Target;
int iAddrSize;
HANDLE hThreadC2T=NULL,//C2T=ClientToTarget
hThreadT2C=NULL;//T2C=TargetToClient
DWORD dwThreadID;

__try
{
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("\nWSAStartup() failed:%d",GetLastError());
__leave;
}
sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(sListen==INVALID_SOCKET)
{
printf("\nsocket() failed:%d",GetLastError());
__leave;
}

Local.sin_addr.s_addr=htonl(INADDR_ANY);
Local.sin_family=AF_INET;
Local.sin_port=htons(ListenPort);

Target.sin_family=AF_INET;
Target.sin_addr.s_addr=inet_addr(TargetIP);
Target.sin_port=htons(TargetPort);

if(bind(sListen,(struct sockaddr *)&Local,sizeof(Local))==SOCKET_ERROR)
{
printf("\nbind() failed:%d",GetLastError());
__leave;
}
if(listen(sListen,1)==SOCKET_ERROR)
{
printf("\nlisten() failed:%d",GetLastError());
__leave;
}
//scoket循环
while(1)
{
printf("\n\n*************Waiting Client Connect to**************\n\n");
iAddrSize=sizeof(Client);
//get socket sClient
sock[0]=accept(sListen,(struct sockaddr *)&Client,&iAddrSize);
if(sock[0]==INVALID_SOCKET)
{
printf("\naccept() failed:%d",GetLastError());
break;
}
printf("\nAccept client==>%s:%d",inet_ntoa(Client.sin_addr),
ntohs(Client.sin_port));
//create socket sTarget
sock[1]=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(sock[1]==INVALID_SOCKET)
{
printf("\nsocket() failed:%d",GetLastError());
__leave;
}
//connect to target port
if(connect(sock[1],(struct sockaddr *)&Target,sizeof(Target))==SOCKET_ERROR)
{
printf("\nconnect() failed:%d",GetLastError());
__leave;
}
printf("\nconnect to target 3389 success!");
//创建两个线程进行数据转发
hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(LPVOID)sock,0,&dwThreadID);
hThreadT2C=CreateThread(NULL,0,TCPDataT2C,(LPVOID)sock,0,&dwThreadID);
//等待两个线程结束
WaitForSingleObject(hThreadC2T,INFINITE);
WaitForSingleObject(hThreadT2C,INFINITE);
CloseHandle(hThreadC2T);
CloseHandle(hThreadT2C);
closesocket(sock[1]);
closesocket(sock[0]);
printf("\n\n*****************Connection Close*******************\n\n");
}//end of sock外循环
}//end of try
__finally
{
if(sListen!=INVALID_SOCKET) closesocket(sListen);
if(sock[0]!=INVALID_SOCKET) closesocket(sock[0]);
if(sock[1]!=INVALID_SOCKET) closesocket(sock[1]);
if(hThreadC2T!=NULL) CloseHandle(hThreadC2T);
if(hThreadT2C!=NULL) CloseHandle(hThreadT2C);
WSACleanup();
}
return 0;
}
/*************************************************************************
Module:TCPDataRedird.c
Date:2001/4/16
CopyRight(c) eyas
HomePage:www.patching.net
Thanks to shotgun
说明:TCP socket数据转发,sock[0]==>sClient sock[1]==>sTarget
*************************************************************************/
#define BuffSize 20*1024 //缓冲区大小20k
//此函数负责从Client读取数据,然后转发给Target
DWORD WINAPI TCPDataC2T(SOCKET* sock)
{
int iRet,
ret=-1,//select 返回值
iLeft,
idx,
iSTTBCS=0;//STTBCS=SendToTargetBuffCurrentSize
char szSendToTargetBuff[BuffSize]={0},
szRecvFromClientBuff[BuffSize]={0};
fd_set fdread,fdwrite;
printf("\n\n*****************Connection Active*******************\n\n");
while(1)
{
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_SET(sock[0],&fdread);
FD_SET(sock[1],&fdwrite);
if((ret=select(0,&fdread,&fdwrite,NULL,NULL))==SOCKET_ERROR)
{
printf("\nselect() failed:%d",GetLastError());
break;
}
//printf("\nselect() return value ret=%d",ret);
if(ret>0)
{
//sClinet可读,client有数据要发送过来
if(FD_ISSET(sock[0],&fdread))
{
//接收sock[0]发送来的数据
iRet=recv(sock[0],szRecvFromClientBuff,BuffSize,0);
if(iRet==SOCKET_ERROR)
{
printf("\nrecv() from sock[0] failed:%d",GetLastError());
break;
}
else if(iRet==0)
break;
printf("\nrecv %d bytes from sClinet.",iRet);
//把从client接收到的数据存添加到发往target的缓冲区
memcpy(szSendToTargetBuff+iSTTBCS,szRecvFromClientBuff,iRet);
//刷新发往target的数据缓冲区当前buff大小
iSTTBCS+=iRet;
//清空接收client数据的缓冲区
memset(szRecvFromClientBuff,0,BuffSize);
}
//sTarget可写,把从client接收到的数据发送到target
if(FD_ISSET(sock[1],&fdwrite))
{
//转发数据到target的3389端口
iLeft=iSTTBCS;
idx=0;
while(iLeft>0)
{
iRet=send(sock[1],&szSendToTargetBuff[idx],iLeft,0);
if(iRet==SOCKET_ERROR)
{
printf("\nsend() to target failed:%d",GetLastError());
break;
}
printf("\nsend %d bytes to target",iRet);
iLeft-=iRet;
idx+=iRet;
}
//清空缓冲区
memset(szSendToTargetBuff,0,BuffSize);
//重置发往target的数据缓冲区当前buff大小
iSTTBCS=0;
}
}//end of select ret
Sleep(1);
}//end of data send & recv循环
return 0;
}
//此函数负责从target读取数据,然后发送给client
DWORD WINAPI TCPDataT2C(SOCKET* sock)
{
int iRet,
ret=-1,//select 返回值
iLeft,
idx,
iSTCBCS=0;//STCBCS=SendToClientBuffCurrentSize
char szRecvFromTargetBuff[BuffSize]={0},
szSendToClientBuff[BuffSize]={0};
fd_set fdread,fdwrite;

while(1)
{
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_SET(sock[0],&fdwrite);
FD_SET(sock[1],&fdread);
if((ret=select(0,&fdread,&fdwrite,NULL,NULL))==SOCKET_ERROR)
{
printf("\nselect() failed:%d",GetLastError());
break;
}
if(ret>0)
{
//sTarget可读,从target接收数据
if(FD_ISSET(sock[1],&fdread))
{
//接收target返回数据
iRet=recv(sock[1],szRecvFromTargetBuff,BuffSize,0);
if(iRet==SOCKET_ERROR)
{
printf("\nrecv() from target failed:%d",GetLastError());
break;
}
else if(iRet==0)
break;
printf("\nrecv %d bytes from target",iRet);
//把从target接收到的数据添加到发送到client的缓冲区
memcpy(szSendToClientBuff+iSTCBCS,szRecvFromTargetBuff,iRet);
//清空接收target返回数据缓冲区
memset(szRecvFromTargetBuff,0,BuffSize);
//刷新发送到client的数据缓冲区当前大小
iSTCBCS+=iRet;
}
//client可写,发送target返回数据到client
if(FD_ISSET(sock[0],&fdwrite))
{
//发送target返回数据到client
iLeft=iSTCBCS;
idx=0;
while(iLeft>0)
{
iRet=send(sock[0],&szSendToClientBuff[idx],iLeft,0);
if(iRet==SOCKET_ERROR)
{
printf("\nsend() to Client failed:%d",GetLastError());
break;
}
printf("\nsend %d bytes to Client",iRet);
iLeft-=iRet;
idx+=iRet;
}
//清空缓冲区
memset(szSendToClientBuff,0,BuffSize);
iSTCBCS=0;
}
}//end of select ret
Sleep(1);
}//end of while
return 0;
}
...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
swords_man 2005-04-07
  • 打赏
  • 举报
回复
我知道了,是strcpy的问题
富莱工作室 2005-04-07
  • 打赏
  • 举报
回复
你的参数是怎样传递的, 问题肯定出在参数上,
LPVOID)&sock, 还是,(LPVOID)sock
swords_man 2005-04-07
  • 打赏
  • 举报
回复
谢谢,我知道了很多线程的深入知识,但是有一点问题
SOCKET *sock=(SOCKET *)socket;
编译成功后,运行时有错误了
0x00404b6b指令引用了0x00000000指令,提示该内存不能读,但是我的程序里面没有发现读0x00000000内存的啊,是不是指针越界??
富莱工作室 2005-04-07
  • 打赏
  • 举报
回复
不能, 线程函数要求参数一定为LPVOID 使用SOCKET* 做作为参数, 是不能成功的
所以在声明时, 必须声明DWORD WINAPI TCPDataT2C(LPVOID lParam);
你想传入参数sock, 必须将强制转换LPVOID 即void*, 在线程函数内部,再用强制转换,恢复原来类型
swords_man 2005-04-07
  • 打赏
  • 举报
回复
DWORD WINAPI TCPDataT2C(SOCKET* sock);
hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(SOCKET)sock,0,&dwThreadID);

能这样传吗?
代码在二楼,我帖出来了
富莱工作室 2005-04-07
  • 打赏
  • 举报
回复
线程函数必须为这种形势:DWORD WINAPI TCPDataT2C(void* sock);
创建时 hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(LPVOID)&sock,0,&dwThreadID);

至于传参数,到底是传,(LPVOID)&sock, 还是,(LPVOID)sock,我没看你代码,也不知你想怎么做
,所以自已看着办, 但是必须使用以上形式
swords_man 2005-04-07
  • 打赏
  • 举报
回复
楼上的这个
DWORD WINAPI TCPDataT2C(SOCKET* sock);
DWORD WINAPI TCPDataT2C(void* sock);
hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(LPVOID)&sock,0,&dwThreadID);
我不是很明白
富莱工作室 2005-04-07
  • 打赏
  • 举报
回复
DWORD WINAPI TCPDataT2C(SOCKET* sock);
DWORD WINAPI TCPDataT2C(void* sock);

hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(LPVOID)&sock,0,&dwThreadID);

swords_man 2005-04-07
  • 打赏
  • 举报
回复
我改成这样 hThreadC2T=CreateThread(NULL,0,TCPDataC2T,(SOCKET *)sock,0,&dwThreadID);
hThreadT2C=CreateThread(NULL,0,TCPDataT2C,(SOCKET *)sock,0,&dwThreadID);
DWORD WINAPI TCPDataT2C(SOCKET *sock)

有这样的错误。。
C:\Documents and Settings\Administrator\桌面\AgentGateWay.cpp(99) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (unsigned int *)' to 'unsigned long (__stdcall *)(void *)'
None of the functions with this name in scope match the target type
zhousqy 2005-04-06
  • 打赏
  • 举报
回复
up
zengwujun 2005-04-06
  • 打赏
  • 举报
回复
(LPVOID)sock和(SOCKET* sock1);不一致

把前者转为后者
sock1=(SOCKET*)sock;

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧