[关闭]
@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程序.
  • 如下图设计服务器图标.
    服务器
  • 如下图建立服务器类向导.
    value
    control
  • 将服务器需要用到的所有变量作为Sedlg的变量.
  1. WSADATA wsaData;
  2. SOCKET hServSock, hClntSock;
  3. SOCKADDR_IN servAdr, clntAdr;
  4. int i, Len, recLen, recCnt;
  5. char msg[1024];
  6. int clntAdrSize;
  • 按如下代码编辑点击连接按钮的函数.
  1. UpdateData(TRUE); //将控件的值赋值给成员变量
  2. if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0){
  3. AfxMessageBox(_T("WSAStartup() error!"));
  4. exit(1);
  5. }
  6. hServSock=socket(PF_INET, SOCK_STREAM, 0);
  7. if(hServSock==INVALID_SOCKET){
  8. AfxMessageBox(_T("socket() error!"));
  9. exit(1);
  10. }
  11. memset(&servAdr, 0, sizeof(servAdr));
  12. servAdr.sin_family=AF_INET;
  13. servAdr.sin_addr.s_addr=htonl(INADDR_ANY);
  14. servAdr.sin_port=htons(m_Port);
  15. if(bind(hServSock,(SOCKADDR*)&servAdr,sizeof(servAdr))==SOCKET_ERROR){
  16. AfxMessageBox(_T("bind() error!"));
  17. exit(1);
  18. }
  19. if(listen(hServSock, 5)==SOCKET_ERROR){
  20. AfxMessageBox(_T("listen() error!"));
  21. exit(1);
  22. }
  23. clntAdrSize=sizeof(clntAdr);
  24. AfxBeginThread(Accept_Thread, this);//启动新线程并执行Accept_Thread函数
  25. UpdateData(FALSE); ///将成员变量的值赋值给控件
  • 创建线程,将accept函数放入新建立的进程上.
  1. CSeDlg *dlg=(CSeDlg*)lParam; ///获得显示的图标的句柄
  2. while(1)
  3. {
  4. dlg->hClntSock=accept(dlg->hServSock, (SOCKADDR*)&dlg->clntAdr, &dlg->clntAdrSize);
  5. dlg->recLen = 0;
  6. recv(dlg->hClntSock, (char*)&dlg->Len, 4, 0);///以下开始接收数据
  7. while(dlg->recLen < dlg->Len){
  8. dlg->recCnt = recv(dlg->hClntSock, &dlg->msg[dlg->recLen],1023, 0);
  9. dlg->recLen += dlg->recCnt;
  10. }
  11. dlg->msg[dlg->Len] = '\n';
  12. dlg->msg[dlg->Len+1] = '\0';
  13. ///以下语句将收到的数据显示出来.
  14. int lastline =dlg->m_Str.LineIndex(dlg->m_Str.GetLineCount()-1);
  15. dlg->m_Str.SetSel(lastline+1,lastline+2,0);
  16. dlg->m_Str.ReplaceSel((CString)dlg->msg);
  17. send(dlg->hClntSock, dlg->msg, dlg->Len, 0);
  18. closesocket(dlg->hClntSock);
  19. }
  20. closesocket(dlg->hServSock);
  21. WSACleanup();
  • 执行服务器.
  • 如下图设计客户端图标.
    客户端
  • 如下图建立客户端类向导.
    类向导
  • 编辑客户端连接代码
  1. UpdateData(TRUE);
  2. if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
  3. exit(1);
  4. hSocket=socket(PF_INET, SOCK_STREAM, 0);
  5. if(hSocket==INVALID_SOCKET)
  6. exit(1);
  7. memset(&servAdr, 0, sizeof(servAdr));
  8. servAdr.sin_family=AF_INET;
  9. DWORD adr;
  10. m_Ip.GetAddress(adr);
  11. servAdr.sin_addr.s_addr= htonl(adr);
  12. servAdr.sin_port=htons(m_Port);
  13. if(connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr))==SOCKET_ERROR)
  14. exit(1);
  15. int *p;
  16. p = (int*)msg;
  17. *p = m_Len;
  18. opCnt = *((int*)msg);
  19. for(i = 0; i < opCnt; i++)
  20. *(msg+i+4) = m_Str[i];
  21. send(hSocket, msg, opCnt+4, 0);
  22. recv(hSocket, ans, opCnt, 0);
  23. ans[opCnt] = '\0';
  24. m_Ans.SetWindowTextW((CString)ans);
  25. closesocket(hSocket);
  26. WSACleanup();
  27. UpdateData(FALSE);

*执行客户端.

实验结果

result

感想

通过此次试验我收获挺大的,首先知道了visual studio网络编程,如果使用MFC就需将网络编程变量定义为全局变量,其次各种无响应问题.后面才知道不能让其一直等待,最好是开一个新进程,让新进程来执行等待过程这样就不会引起无响应问题.做完之后感觉挺爽快的

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注