有以下两个方法,我在Connect中创建SOCKET但是在Connect中的值是正常的,到了Receive中就变了:
Connect:780
Receive:1895679544
求高手帮看看原因!!!
// 连接设备
LONG Czh_OcxIFCtrl::Connect(LPCTSTR ComNum, LONG NaudNum)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
// 初始化套接字
WSADATA wsa;
if(WSAStartup(MAKEWORd(2,2),&wsa)!=0){
Sleep(3000);
return 0;
}
//创建套接字
static SOCKET sock;
if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
return 0;
}
struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = inet_addr(ComNum);
serverAddress.sin_port = htons(NaudNum);
//建立和服务器的连接
if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
Sleep(3000);
return 0;
}
static int sockID = sock;
//启动线程接收数据
char str[20];
sprintf(str, "%d", sock);
FILE* log;
log=fopen("log/log1.txt","a+");
if (log!=NULL){
fprintf(log,"%s\n",str);
}
fclose(log);
_beginthread(Receive,0,&sockID);
//记录连接
string ipadd(ComNum);
socketList[ipadd] = sockID;
ipList[sockID] = ipadd;
return 1;
}
void Czh_OcxIFCtrl::Receive(PVOID param)
{
int* sockID = (int*)param;
char str[20];
sprintf(str, "%d", sockID);
FILE* log;
log=fopen("log/log1.txt","a+");
if (log!=NULL){
fprintf(log,"%s\n",str);
}
fclose(log);
char buf[2096];
while(1)
{
SOCKET* sock=(SOCKET*)param;
int bytes;
if((bytes=recv(*sock,buf,sizeof(buf),0))==SOCKET_ERROR){
continue;
}
}
}
C++中_beginthread传递的参数值错误
答案:1 悬赏:70 手机版
解决时间 2021-02-28 10:01
- 提问者网友:浩歌待明月
- 2021-02-27 10:07
最佳答案
- 五星知识达人网友:撞了怀
- 2021-02-27 10:18
别用&sockID
用 (LPVOID) sockID
转回来的时候别用
int* sockID = (int*) param;
用
int sockID = (int) param; (或者SOCKET sock = (SOCKET)param;
原因:你引用指针的时候,指针指向的变量已经没掉了(出了作用域了
所以你应该传值而不是传指针
用 (LPVOID) sockID
转回来的时候别用
int* sockID = (int*) param;
用
int sockID = (int) param; (或者SOCKET sock = (SOCKET)param;
原因:你引用指针的时候,指针指向的变量已经没掉了(出了作用域了
所以你应该传值而不是传指针
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯