switch(message) /*用开关语句判断消息并进行相应处理*/
{
case WM_CREATE: //窗口建立消息
GameEngine::GetGameEngine()->SetWindow(hWnd); //设置窗口句柄
GameStart(hWnd);
hEditName=CreateWindowEx(NULL,"edit","Mayi",WS_CHILD|WS_VISIBLE|WS_BORDER,100,30,120,25,hWnd,HMENU(EditID1),NULL,NULL);
hEditPass=CreateWindowEx(NULL,"edit", "123",WS_CHILD|WS_VISIBLE|WS_BORDER,100,60,120,25,hWnd,HMENU(EditID2),NULL,NULL);
hButtonOk=CreateWindowEx(NULL,"button","登录",WS_CHILD|WS_VISIBLE|WS_BORDER,100,90,60,25,hWnd,HMENU(ButtonID1),(HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL);
hButtonCancel=CreateWindowEx(NULL,"button","Cancel",WS_CHILD|WS_VISIBLE|WS_BORDER,180,90,60,25,hWnd,HMENU(ButtonID2),(HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
break;
case WM_COMMAND:
if ((lParam!=0)&&((wParam&0xffff)==ButtonID1))//登录按钮
{
GetDlgItemText(hWnd,EditID1,wStrName,1024);//把editId1的什给wstrname
GetDlgItemText(hWnd,EditID2,wStrPass,1024);//把editId1的什给wstrpass
}
case WM_SOCKET:
if (WSAGETSELECTERROR(lParam))
{
closesocket( (SOCKET) wParam);
break;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT :
break; case FD_READ:
g_pMayiClient->recvMayi(wParam);//接收信息
break;
case FD_WRITE:
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
break;
case FD_CLOSE:
closesocket( (SOCKET)wParam);
break;
}
break;
case WM_DESTROY: //程序销毁消息
GameEnd(); //游戏结束,释放资源
PostQuitMessage(0); //通知WINDOWS,程序已发出终止请求
break; default:
//没有其他消息时,Windows将调用此缺省函数进行处理
return DefWindowProc(hWnd,message,wParam,lParam);
}
这是客户端,我点击登录按钮,把可以提供给用户输入的hEditName,hEditPass编辑框的内容发送给服务端,这可不知道怎么做?如果我把FD_WRITE的发送放到登录按钮上 case WM_COMMAND:
if ((lParam!=0)&&((wParam&0xffff)==ButtonID1))//登录按钮
{
GetDlgItemText(hWnd,EditID1,wStrName,1024);//把editId1的什给wstrname
GetDlgItemText(hWnd,EditID2,wStrPass,1024);//把editId1的什给wstrpass
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
}
}经调试,服务器端接收不到数据,要实现这个不知道怎么做呀,我在登录按钮创建发送数据线程不知道有用吗?
有什么办法吗,把我想要的实现?
最后:谢谢在网络另一端的你,认真看完这个题目。
if ((lParam!=0)&&((wParam&0xffff)==ButtonID1))
{
GetDlgItemText(hWnd,EditID1,wStrName,1024);
GetDlgItemText(hWnd,EditID2,wStrPass,1024);
//memcpy(mc.p.name ,wStrName,strlen(wStrName));
b=TRUE; if (StrCmp(wStrName,"Mayi"))
{
MessageBox(NULL,"密码错误!",NULL,MB_OK);
}
else
{
MessageBox(NULL,"密码正确","恭喜",MB_OK);
}
SOCKET MayiClient;
WSADATA wsd;
SOCKADDR_IN MClientAddr;
HWND Window;
WSAStartup(MAKEWORD(2,2), &wsd);
MayiClient = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
MClientAddr.sin_family = AF_INET;
MClientAddr.sin_addr.s_addr = inet_addr("192.168.18.8");
//MClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
MClientAddr.sin_port = htons(5150);
//if(b==TRUE)
connect(MayiClient,(SOCKADDR *)&MClientAddr,sizeof(MClientAddr));
WSAAsyncSelect(MayiClient, hWnd, WM_SOCKET, FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
SendMessage(hWnd,WM_SOCKET,(LPARAM)wStrName|(LPARAM)wStrPass,(LPARAM)FD_WRITE);
//
}
break;这是我修改过来的,现在是可以接收信息,但不能传把strName,和strPass参数DWORD WINAPI MayiClient::sendMayi(WPARAM wParam,CHAR wStrName[1024],CHAR wStrPass[1024])
{ int nErrCode;
packethdr packetHdr;// packetHdr;
memset(&packetHdr, 0, sizeof(packetHdr));
packetHdr.type='A';
//memcpy(packetHdr.name,wStrName,sizeof(wStrName));
//memcpy(packetHdr.password,wStrPass,sizeof(wStrPass));
memcpy(packetHdr.name,"Mayi",sizeof("Mayi"));
memcpy(packetHdr.password,"123",sizeof("123"));
nErrCode = send(wParam,(char*)&packetHdr,sizeof(packetHdr), 0);
if (SOCKET_ERROR == nErrCode)
{
return 0;
}
}可以正常接收,但如果我用改成下面的,
memcpy(packetHdr.name,wStrName,sizeof(wStrName));
memcpy(packetHdr.password,wStrPass,sizeof(wStrPass));
//memcpy(packetHdr.name,"Mayi",sizeof("Mayi"));
//memcpy(packetHdr.password,"123",sizeof("123"));对方收不到数据,经调试,strName 和strPass还是为空值,意思是说不能传递数据。
不知怎么做才好?
hEditPass=CreateWindowEx(NULL,"edit", "123",WS_CHILD|WS_VISIBLE|WS_BORDER,100,60,120,25,hWnd,HMENU(EditID2),
GetDlgItemText(hWnd,EditID1,wStrName,1024);
GetDlgItemText(hWnd,EditID2,wStrPass,1024);
这是我存放的数据如果在这里最后面发送信息 case WM_COMMAND:...
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
//经调试wStrName wStrPass 有内容,内容不为空,但放到这里,服务器还是接收不到数据
break; case FD_WRITE:
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
//这里不管是不是在case WM_COMMAND有没有发送数据,经调试wStrName wStrPass内容为空。
所以MayiClient::sendMayi执行这里 wStrName wStrPass 调试发现内容为空
memcpy(packetHdr.name,wStrName,sizeof(wStrName));
memcpy(packetHdr.password,wStrPass,sizeof(wStrPass))所以最后没有把我想要发送的内容发送出去。
CHAR wStrPass[1024]="0";我刚开发始定义在WndProc内部,所以每次调用的时候不能达到目的正确的应该是定义在头文件那里 CHAR wStrName[1024]="0";
CHAR wStrPass[1024]="0";
不过还是要特别谢谢mengde007,耐心的看完题目,以及耐心的解答。