《基于tcp的客户端服务器程序代码》由会员分享,可在线阅读,更多相关《基于tcp的客户端服务器程序代码(8页珍藏版)》请在金锄头文库上搜索。
1、武汉理工大学计算机网络与通信课程设计说明书服务器端程序 / TODO: Add extra initialization hereaddr.sin_family=AF_INET;/TCP IPv4 addr sin_port=htons(8090); /指定端口号,动态端口的范围从1024到65535,这里使用8090 addr.sin_addr.S_un.S_addr=INADDR_ANY; /*机器上可能有多块网卡,也就有多个IP地址, 如果指定为INADDR_ANY,那么系统将绑定默认的网卡即IP地址*/ s=:socket(AF_INET,SOCK_STREAM,0); /利用sock
2、et函数创建套接字 :bind(s,(sockaddr*)&addr,sizeof(addr);/调用bind函数把套接字s绑定到本地地址和指定端口号上 :listen(s,5); /s监听网络中的所有客户机:WSAAsyncSelect(s,this-m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);/接收读和连接通知 GetDlgItem(IDC_TEXT)-EnableWindow(true); /激活编辑框显示 GetDlgItem(IDC_ADDR)-SetWindowText(服务器开始监听!);void CTCPDlg:OnSocket(WPARAM wPa
3、ram,LPARAM lParam) CString str; CString str13; CString str14; unsigned short int str15; char cs100=0;switch (lParam)/响应通知 case FD_ACCEPT: int lenth=sizeof(add1); s1=:accept(s,(sockaddr*)&add1,&lenth); /*s1为服务器和客户端通信的套接字 add1为客户端通信的套接字*/ n=n+1; str13.Format(有%d客户已经连接上了,n); /str13=有n客户已经连接上了 str13+=rn
4、; str13+=:inet_ntoa(add1.sin_addr); /ip地址转换成点分十进制的字符串 str13+=登陆; GetDlgItem(IDC_TEXT)-GetWindowText(str); str13+=rn; str+=str13; GetDlgItem(IDC_TEXT)-SetWindowText(str); /显示已经连接以及连接的客户端 str14=:inet_ntoa(add1.sin_addr); GetDlgItem(client_ip)-SetWindowText(str14); /显示客户端的ip str15=htons(add1.sin_port);
5、 SetDlgItemInt(client_port,str15,1); /显示客户端的port CString st; st=I am a server.; :send(s1,st.GetBuffer(1),strlen(st),0);break;case FD_READ: CString num=,num1=,num2=; :recv(s1,cs,100,0); /接收客户端的数据 for(int i=0;iGetWindowText(num1); num1+=rn; num+=num1; num+=(LPTSTR):inet_ntoa(add1.sin_addr); /LPTSTR与ch
6、ar*等价 num+=客户端:; num+=num2; GetDlgItem(IDC_TEXT)-SetWindowText(num); /显示客户端发来的信息 break;void CTCPDlg:OnSend() /发送按钮的事件函数/ TODO: Add your control notification handler code hereCString str=,str1,str2;GetDlgItem(IDC_SENDTEXT)-GetWindowText(str);if(str=)MessageBox(发送的消息不能为空);/不能发送空消息elseif(:send(s1,str.G
7、etBuffer(1),strlen(str),0)!=SOCKET_ERROR) GetDlgItem(IDC_TEXT)-GetWindowText(str1);str1+=rn;str1+=发送:; str1+=str; GetDlgItem(IDC_TEXT)-SetWindowText(str1);/显示发送的消息 elseGetDlgItem(IDC_TEXT)-GetWindowText(str1); str1+=rn;str1+=消息发送失败!; GetDlgItem(IDC_TEXT)-SetWindowText(str1); /提示发送消息失败客户端程序GetDlgItem
8、(IDC_SENDTEXT)-EnableWindow(false);GetDlgItem(IDC_SEND)-EnableWindow(false); /禁止发送s=:socket(AF_INET,SOCK_STREAM,0);/创建套接字: WSAAsyncSelect(s,this-m_hWnd,WM_SOCKET, FD_READ);/接收读通知void CTCPDlg:OnConnect() /连接按钮的事件函数 CString str,str1; int port; GetDlgItem(IDC_ADDR)-GetWindowText(str); GetDlgItem(IDC_PO
9、RT)-GetWindowText(str1); /输入服务器IP和端口号 if(str=|str1=) MessageBox(服务器地址或端口不能为NULL); else port=atoi(str1.GetBuffer(1); /把字符串形式的port转换成整型数 addr.sin_family=AF_INET; addr.sin_addr.S_un.S_addr=inet_addr(str.GetBuffer(1); /将点分十进制的IP转换成长整数型数 addr.sin_port=ntohs(port); /将无符号短整形port由网络字节顺序转换为主机字节顺序 /addr存储服务器套
10、接字信息,s存储客户端套接字信息 GetDlgItem(IDC_TEXT)-SetWindowText(正在连接服务器.rn); if(:connect(s,(sockaddr*)&addr,sizeof(addr) /向服务器发送连接请求 CString st; st=I am aclient; :send(s,st.GetBuffer(1),strlen(st),0); GetDlgItem(IDC_TEXT)-GetWindowText(str); str+=连接服务器成功!rn; GetDlgItem(IDC_TEXT)-SetWindowText(str); GetDlgItem(I
11、DC_SENDTEXT)-EnableWindow(true); /发送框可用 GetDlgItem(IDC_SEND)-EnableWindow(true); /发送按钮可用 GetDlgItem(IDC_ADDR)-EnableWindow(false); /禁止再在输入服务器ip GetDlgItem(IDC_PORT)-EnableWindow(false); /禁止再输入服务器的端口号 else GetDlgItem(IDC_TEXT)-GetWindowText(str); str+=连接服务器失败!请重试rn; GetDlgItem(IDC_TEXT)-SetWindowText
12、(str); void CTCPDlg:OnSend() /发送按钮的事件函数/ TODO: Add your control notification handler code hereCString str,str1;GetDlgItem(IDC_SENDTEXT)-GetWindowText(str);if(str=)MessageBox(发送的消息不能为空);/不能发送空消息else if(:send(s,str.GetBuffer(1),strlen(str),0)!=SOCKET_ERROR)GetDlgItem(IDC_TEXT)-GetWindowText(str1);str1+=rn;str1+=发送:+str;GetDlgItem(IDC_TEXT)-SetWindowText(str1);/显示发送的消息 else GetDlgItem(IDC_TEXT)-GetWindowText(str1); st