- #include"windows.h"
- #include"winsock.h"
- #include"resource.h"
- #include"PROCESS.H"
- #defineSTATUS_SEND0
- #defineSTATUS_REVE1
- #defineSTATUS_DONE2
- #defineWM_MESSAGE_REVED(WM_USER+0)
- #defineWM_MESSAGE_SENDED(WM_USER+1)
- #definePORTNUM5000//端口号
- #defineHOSTNAME"localhost"//服务器名字
- //根据服务器的不同,更改上面的名字
- typedefstruct
- {
- HWNDhwnd;
- BOOLbContinue;
- SOCKETServerSock;
- }
- PARAMS,*PPARAMS;
- //===FunctionPrototypes====================================================
- BOOLWINAPIMainDlgProc(HWND,UINT,WPARAM,LPARAM);
- voidNetworkThread(PVOIDpvoid);
- //===GlobalVariables=======================================================
- HINSTANCEhInst;
- charszClientA[100];//ASCII码串
- TCHARszClientW[100];//Unicode串
- TCHARszSendBuffer[100];
- TCHARszError[100];//出错消息串
- //===ApplicationEntryPoint================================================
- intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrev,LPSTRlpCmd,
- intnShow)
- {
- WNDCLASSwc;
- GetClassInfo(NULL,WC_DIALOG,&wc);//Getdialogboxclassinfo
- wc.hInstance=hInstance;
- wc.lpszClassName="Client";//so'swecansuperclassit
- wc.lpfnWndProc=DefDlgProc;//allthisforanicon...sheesh
- wc.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(100));
- wc.cbWndExtra=DLGWINDOWEXTRA;
- if(!RegisterClass(&wc))//Quitifregistrationfails
- return(FALSE);
- hInst=hInstance;//Nowjuststartthemaindialogandexit
- DialogBox(hInstance,MAKEINTRESOURCE(ID_CLIENT),NULL,MainDlgProc);
- return(FALSE);
- }
- //===MainDialogBox========================================================
- BOOLWINAPIMainDlgProc(HWNDhDlg,UINTmsg,WPARAMwParam,LPARAMlParam)
- {
- staticSOCKETServerSock=INVALID_SOCKET;//服务器的socket
- staticSOCKADDR_INdestination_sin;//服务器的socket地址
- staticPHOSTENTphostent=NULL;//指向服务器的HOSTENT结构
- staticWSADATAWSAData;//包含了Winsocket执行后的细节
- staticPARAMSparams;
- switch(msg)
- {
- caseWM_INITDIALOG:
- {
- if(WSAStartup(MAKEWORD(1,1),&WSAData)!=0)
- {
- wsprintf(szError,TEXT("WSAStartupfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- returnFALSE;
- }
- return0;
- }
- caseWM_PAINT://PaintdialogboxbackgroundCOLOR_BTNFACE
- {
- PAINTSTRUCTps;
- HDChDC;
- RECTRect;
- hDC=BeginPaint(hDlg,&ps);
- GetClientRect(hDlg,&Rect);
- FillRect(hDC,&Rect,GetProp(hDlg,"BRUSH"));
- EndPaint(hDlg,&ps);
- return0;
- }
- caseWM_MESSAGE_REVED:
- {
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),szClientW);
- return0;
- }
- caseWM_COMMAND:
- {
- if(wParam==IDC_CONNECT)//连接服务器
- {
- if((ServerSock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
- {
- wsprintf(szError,TEXT("Allocatingsocketfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- returnFALSE;
- }
- //把服务器的socket的地址信息填入
- destination_sin.sin_family=AF_INET;
- //通过主机名取得主机信息
- if((phostent=gethostbyname(HOSTNAME))==NULL)
- {
- wsprintf(szError,TEXT("Unabletogetthehostname.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- closesocket(ServerSock);
- returnFALSE;
- }
- //分配socketIP地址
- memcpy((charFAR*)&(destination_sin.sin_addr),
- phostent->h_addr,
- phostent->h_length);
- //转化端口字段为大终点
- destination_sin.sin_port=htons(PORTNUM);
- //建立一个到服务器socket的连接.
- if(connect(ServerSock,
- (PSOCKADDR)&destination_sin,
- sizeof(destination_sin))==SOCKET_ERROR)
- {
- wsprintf(szError,
- TEXT("Connectingtotheserverfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- closesocket(ServerSock);
- returnFALSE;
- }
- params.hwnd=hDlg;
- params.bContinue=TRUE;
- params.ServerSock=ServerSock;
- _beginthread(NetworkThread,0,¶ms);
- }
- elseif(wParam==IDC_SEND)
- {
- GetWindowText(GetDlgItem(hDlg,IDC_EDIT),
- szSendBuffer,GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT)));
- if(send(ServerSock,szSendBuffer,strlen(szSendBuffer)+1,0)
- ==SOCKET_ERROR)
- {
- wsprintf(szError,
- TEXT("Sendingdatatotheserverfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- }
- }
- elseif(wParam==IDCANCEL)
- {
- EndDialog(hDlg,TRUE);
- }
- return(TRUE);
- }
- }
- returnFALSE;
- }
- //EndofMainDlgProc()
- voidNetworkThread(PVOIDpvoid)
- {
- volatilePPARAMSpparams;
- intindex=0,//索引
- iReturn;//recv函数的返回值
- pparams=(PPARAMS)pvoid;
- for(;;)
- {
- //从服务器接收信息
- iReturn=recv(pparams->ServerSock,szClientA,sizeof(szClientA),0);
- //如果接收到服务器信息,显示之
- if(iReturn==SOCKET_ERROR)
- {
- wsprintf(szError,TEXT("Nodataisreceived,recvfailed.")
- TEXT("Error:%d"),WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Client"),MB_OK);
- break;
- }
- elseif(iReturn==0)
- {
- MessageBox(NULL,TEXT("Finishedreceivingdata"),TEXT("Client"),
- MB_OK);
- break;
- }
- else
- {
- //把ASCII码字符串转换成Unicode码字符串
- for(index=0;index<=sizeof(szClientA);index++)
- szClientW[index]=szClientA[index];
- //显示从服务器接收到的字符串
- //MessageBox(NULL,szClientW,TEXT("ReceivedFromServer"),MB_OK);
- SendMessage(pparams->hwnd,WM_MESSAGE_REVED,0,0);
- }
- }
- //禁止服务器发送信息
- shutdown(pparams->ServerSock,0x00);
- //关闭服务器socket.
- closesocket(pparams->ServerSock);
- WSACleanup();
- }