@1405010312
2016-10-26T13:48:36.000000Z
字数 2495
阅读 412
网络编程
报告提交日期:2016/10/18 报告截止日期:2016/10/19
姓名:肖罗罗 学号:1405010312 班级:计算机三班
- 设计并实现一个能完成p100第(5)题功能的GUI程序
- Windows平台下visual studio环境
- 打开visual studio并传建一个MFC程序.
- 如下图设计服务器图标.
- 如下图建立服务器类向导.
![]()
- 将服务器需要用到的所有变量作为Sedlg的变量.
WSADATA wsaData;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAdr, clntAdr;
int i, Len, recLen, recCnt;
char msg[1024];
int clntAdrSize;
- 按如下代码编辑点击连接按钮的函数.
UpdateData(TRUE); //将控件的值赋值给成员变量
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0){
AfxMessageBox(_T("WSAStartup() error!"));
exit(1);
}
hServSock=socket(PF_INET, SOCK_STREAM, 0);
if(hServSock==INVALID_SOCKET){
AfxMessageBox(_T("socket() error!"));
exit(1);
}
memset(&servAdr, 0, sizeof(servAdr));
servAdr.sin_family=AF_INET;
servAdr.sin_addr.s_addr=htonl(INADDR_ANY);
servAdr.sin_port=htons(m_Port);
if(bind(hServSock,(SOCKADDR*)&servAdr,sizeof(servAdr))==SOCKET_ERROR){
AfxMessageBox(_T("bind() error!"));
exit(1);
}
if(listen(hServSock, 5)==SOCKET_ERROR){
AfxMessageBox(_T("listen() error!"));
exit(1);
}
clntAdrSize=sizeof(clntAdr);
AfxBeginThread(Accept_Thread, this);//启动新线程并执行Accept_Thread函数
UpdateData(FALSE); ///将成员变量的值赋值给控件
- 创建线程,将accept函数放入新建立的进程上.
CSeDlg *dlg=(CSeDlg*)lParam; ///获得显示的图标的句柄
while(1)
{
dlg->hClntSock=accept(dlg->hServSock, (SOCKADDR*)&dlg->clntAdr, &dlg->clntAdrSize);
dlg->recLen = 0;
recv(dlg->hClntSock, (char*)&dlg->Len, 4, 0);///以下开始接收数据
while(dlg->recLen < dlg->Len){
dlg->recCnt = recv(dlg->hClntSock, &dlg->msg[dlg->recLen],1023, 0);
dlg->recLen += dlg->recCnt;
}
dlg->msg[dlg->Len] = '\n';
dlg->msg[dlg->Len+1] = '\0';
///以下语句将收到的数据显示出来.
int lastline =dlg->m_Str.LineIndex(dlg->m_Str.GetLineCount()-1);
dlg->m_Str.SetSel(lastline+1,lastline+2,0);
dlg->m_Str.ReplaceSel((CString)dlg->msg);
send(dlg->hClntSock, dlg->msg, dlg->Len, 0);
closesocket(dlg->hClntSock);
}
closesocket(dlg->hServSock);
WSACleanup();
- 执行服务器.
- 如下图设计客户端图标.
- 如下图建立客户端类向导.
- 编辑客户端连接代码
UpdateData(TRUE);
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
exit(1);
hSocket=socket(PF_INET, SOCK_STREAM, 0);
if(hSocket==INVALID_SOCKET)
exit(1);
memset(&servAdr, 0, sizeof(servAdr));
servAdr.sin_family=AF_INET;
DWORD adr;
m_Ip.GetAddress(adr);
servAdr.sin_addr.s_addr= htonl(adr);
servAdr.sin_port=htons(m_Port);
if(connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr))==SOCKET_ERROR)
exit(1);
int *p;
p = (int*)msg;
*p = m_Len;
opCnt = *((int*)msg);
for(i = 0; i < opCnt; i++)
*(msg+i+4) = m_Str[i];
send(hSocket, msg, opCnt+4, 0);
recv(hSocket, ans, opCnt, 0);
ans[opCnt] = '\0';
m_Ans.SetWindowTextW((CString)ans);
closesocket(hSocket);
WSACleanup();
UpdateData(FALSE);
*执行客户端.
通过此次试验我收获挺大的,首先知道了visual studio网络编程,如果使用MFC就需将网络编程变量定义为全局变量,其次各种无响应问题.后面才知道不能让其一直等待,最好是开一个新进程,让新进程来执行等待过程这样就不会引起无响应问题.做完之后感觉挺爽快的