- #include<windows.h>
- #include<winsock.h>
- #include"resource.h"
- #include"PROCESS.H"
- #definePORTNUM5000//端口号
- #defineMAX_PENDING_CONNECTS4//等待连接队列的最大长度
- #defineWM_MESSAGE_REVED(WM_USER+0)//接收到数据包消息
- #defineWM_MESSAGE_SENDED(WM_USER+1)//发送出到数据包消息
- //主线程向负责接收和发送的线程传递参数
- typedefstruct
- {
- HWNDhwnd;//主线程的窗口句柄
- BOOLbContinue;//状态指示参数
- SOCKETWinSocket;//监听socket
- SOCKADDR_INlocal_sin,//本地socket地址
- accept_sin;//接收连接的socket地址
- }
- PARAMS,*PPARAMS;
- charszServerA[100];//ASCIIstring
- TCHARszServerW[100];//Unicodestring
- TCHARszError[100];//Errormessagestring
- TCHARszSendBuffer[100];//线程间共享缓冲池
- SOCKETClientSock=INVALID_SOCKET;//服务器和客户端通信的Socket
- BOOLWINAPIMainDlgProc(HWNDhDlg,UINTmsg,WPARAMwParam,LPARAMlParam);
- voidNetworkThread(PVOIDpvoid);
- intWINAPIWinMain(
- HINSTANCEhInstance,//实例句柄
- HINSTANCEhPrevInstance,//NULL
- LPTSTRlpCmdLine,//用于运行程序的命令行
- intnCmdShow)//程序的最初的显示方式
- {
- 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);
- returnTRUE;
- }
- //===MainDialogBox========================================================
- BOOLWINAPIMainDlgProc(HWNDhDlg,UINTmsg,WPARAMwParam,LPARAMlParam)
- {
- staticSOCKADDR_INlocal_sin,//本地socket地址
- accept_sin;//接收连接对象的地址
- staticSOCKADDR_INdestination_sin;//服务器的socket地址
- staticPHOSTENTphostent=NULL;//指向服务器的HOSTENT结构
- staticWSADATAWSAData;//包含了Winsocket执行后的细节
- staticPARAMSparams;
- staticSOCKETWinSocket=INVALID_SOCKET;//Windowsocket
- switch(msg)
- {
- caseWM_INITDIALOG://初始化对话框消息
- {
- //初始化Winsocket.
- if(WSAStartup(MAKEWORD(1,1),&WSAData)!=0)
- {
- wsprintf(szError,TEXT("WSAStartupfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- returnFALSE;
- }
- //创建一个TCP/IPsocket,WinSocket.
- if((WinSocket=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
- {
- wsprintf(szError,TEXT("Allocatingsocketfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- returnFALSE;
- }
- //填写本地socket地址信息
- local_sin.sin_family=AF_INET;
- local_sin.sin_port=htons(PORTNUM);
- local_sin.sin_addr.s_addr=htonl(INADDR_ANY);
- //把本地地址绑定到WinSocket.
- if(bind(WinSocket,
- (structsockaddr*)&local_sin,
- sizeof(local_sin))==SOCKET_ERROR)
- {
- wsprintf(szError,TEXT("Bindingsocketfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- closesocket(WinSocket);
- returnFALSE;
- }
- //建立一个socket监听到来的连接
- if(listen(WinSocket,MAX_PENDING_CONNECTS)==SOCKET_ERROR)
- {
- wsprintf(szError,
- TEXT("Listeningtotheclientfailed.Error:%d"),
- WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- closesocket(WinSocket);
- returnFALSE;
- }
- params.hwnd=hDlg;
- params.bContinue=TRUE;
- params.WinSocket=WinSocket;
- params.accept_sin=accept_sin;
- params.local_sin=local_sin;
- _beginthread(NetworkThread,0,¶ms);
- }
- caseWM_PAINT://对话框绘制消息
- {
- 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),szServerW);
- return0;
- }
- caseWM_COMMAND://处理从控件传递来的消息
- {
- if(wParam==IDC_SEND)
- {
- //如果用户点击发送,从输入框中取得文本
- GetWindowText(GetDlgItem(hDlg,IDC_EDIT),
- szSendBuffer,GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT)));
- //发送文本
- if(send(ClientSock,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;
- }
- //辅助线程,负责socket通信
- voidNetworkThread(PVOIDpvoid)
- {
- volatilePPARAMSpparams;
- intindex=0,//索引
- iReturn;
- intaccept_sin_len;//accept_sin的长度
- pparams=(PPARAMS)pvoid;
- accept_sin_len=sizeof(pparams->accept_sin);
- //接收来自发送到WinSocket的连接请求
- ClientSock=accept(pparams->WinSocket,
- (structsockaddr*)&(pparams->accept_sin),
- (int*)&accept_sin_len);
- //停止接收客户端的连接请求
- closesocket(pparams->WinSocket);
- if(ClientSock==INVALID_SOCKET)
- {
- wsprintf(szError,TEXT("Acceptingconnectionwithclientfailed.")
- TEXT("Error:%d"),WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Error"),MB_OK);
- }
- for(;;)
- {
- //从客户端接收数据
- iReturn=recv(ClientSock,szServerA,sizeof(szServerA),0);
- //如果有数据,就显示之
- if(iReturn==SOCKET_ERROR)
- {
- wsprintf(szError,TEXT("Nodataisreceived,recvfailed.")
- TEXT("Error:%d"),WSAGetLastError());
- MessageBox(NULL,szError,TEXT("Server"),MB_OK);
- break;
- }
- elseif(iReturn==0)
- {
- MessageBox(NULL,TEXT("Finishedreceivingdata"),TEXT("Server"),
- MB_OK);
- break;
- }
- else
- {
- //把ASCII码字符串转换成Unicode码字符串
- for(index=0;index<=sizeof(szServerA);index++)
- szServerW[index]=szServerA[index];
- //显示从服务器接收到的字符串
- //MessageBox(NULL,szClientW,TEXT("ReceivedFromServer"),MB_OK);
- SendMessage(pparams->hwnd,WM_MESSAGE_REVED,0,0);
- }
- }
- //发送一条消息到客户端
- //禁止ClientSock的接收和发送端口.
- shutdown(ClientSock,0x02);
- //关闭ClientSock.
- closesocket(ClientSock);
- WSACleanup();
- }