计算机网络作业四

第一章:

服务器端

界面

界面.png

启动服务器按钮对应代码


   
   
  1. void Csocket_serverDlg::OnBnClickedOk()
  2. {
  3.  // TODO: 在此添加控件通知处理程序代码
  4.  CDialogEx::OnOK();
  5.  char *chs = m_edit_port.GetBuffer(0);
  6.  UpdateData(false);
  7.  char *a[] = { "main.exe",chs };
  8.  if (m_edit_port)
  9.  {
  10.  AfxMessageBox("服务器已经开始运行");
  11.  main(2,a);
  12.  }
  13.  else
  14.  AfxMessageBox("请输入端口号");
  15. }

### 头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <process.h>
#include <winsock2.h>
#include <windows.h>
#include<ws2tcpip.h>
#include 
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 5000
#define CO_THREAD_NUM 5

主要代码


   
   
  1. void error_handling(char *message)
  2. {
  3.  AfxMessageBox(message);
  4.  exit(1);
  5. }
  6. void WorkThread(LPVOID lpParam)
  7. {
  8.  SOCKET sockListen = (SOCKET)lpParam;
  9.  SOCKET sockSvr;
  10.  fd_set readSet;
  11.  int ret;
  12.  timeval tv;
  13.  char buf[5000];
  14.  while (1)
  15.  {
  16.  sockSvr = accept(sockListen, NULL, NULL);
  17.  if (sockSvr == INVALID_SOCKET) {
  18.  AfxMessageBox("accept: %d ", WSAGetLastError());
  19.  continue;
  20.  }
  21.  while (1)
  22.  {
  23.  FD_ZERO(&readSet);
  24.  FD_SET(sockSvr, &readSet);
  25.  tv.tv_sec = 5;
  26.  tv.tv_usec = 0;
  27.  ret = select(0, &readSet, NULL, NULL, &tv);
  28.  if (ret == SOCKET_ERROR || ret == 0)
  29.  {
  30.  AfxMessageBox("Socket %d:Sekect error {%d} or Timeout!\n", sockSvr, WSAGetLastError());
  31.  break;
  32.  }
  33.  if (FD_ISSET(sockSvr, &readSet)) {
  34.  memset(buf, 0, 500);
  35.  ret = recv(sockSvr, buf, 5000, 0);
  36.  /*if (ret == SOCKET_ERROR || ret == 0) {
  37.  AfxMessageBox("recv error {%d} or Peer closed!\n", WSAGetLastError());
  38.  break;
  39.  }*/
  40.  ret = send(sockSvr, buf, strlen(buf), 0);
  41.  if (ret == SOCKET_ERROR)
  42.  break;
  43.  }
  44.  }
  45.  closesocket(sockSvr);
  46.  }
  47. }
  48. int main(int argc, char *argv[])
  49. {
  50.  WSADATA Ws;
  51.  int serv_sock;//服务器端socket
  52.  if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
  53.  {
  54.  error_handling("WSAStartup() error!");
  55.  }
  56.  sockaddr_in serv_addr;
  57.  // socklen_t clnt_addr_size;
  58.  if (argc != 2)
  59.  {
  60.  printf("Usage : %s <port>\n", argv[0]);
  61.  exit(1);
  62.  }
  63.  serv_sock = socket(AF_INET, SOCK_STREAM, 0);
  64.  BOOL bReuseAddr = true;
  65.  setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&bReuseAddr, sizeof(bReuseAddr));
  66.  if (serv_sock == -1)
  67.  {
  68.  error_handling("socket() error");
  69.  }
  70.  memset(&serv_addr, 0, sizeof(serv_addr));//serv_addr全部置零,清楚变量值
  71.  serv_addr.sin_family = AF_INET;//表示使用ip地址
  72.  serv_addr.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY表示我不在意Local IP,由系統自行決定
  73.  //若要指定IP,則使用inet_addr,例如:name.sin_addr.s_addr = inet_addr(“140.115.65.1”);
  74.  //將IP字串轉為網路位元排列,如需要反轉換,有inet_ntoa函式可用
  75.  serv_addr.sin_port = htons(atoi(argv[1]));//绑定端口
  76.  if (bind(serv_sock, (sockaddr*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)//绑定
  77.  {
  78.  error_handling("bind() error");
  79.  WSACleanup();
  80.  closesocket(serv_sock);
  81.  return -1;
  82.  }
  83.  if (listen(serv_sock, 5) == SOCKET_ERROR)//对serv_sock进行监听,5表示允许5个用户请求
  84.  {
  85.  error_handling("listen() error");
  86.  WSACleanup();
  87.  closesocket(serv_sock);
  88.  return -1;
  89.  }
  90.  for (int i = 0; i < CO_THREAD_NUM; i++)
  91.  _beginthread(WorkThread, 0, (LPVOID)serv_sock);
  92.  // clnt_addr_size = sizeof(clnt_addr);
  93.  //int nSize = sizeof(SOCKADDR);
  94.  /*char buffer[BUF_SIZE] = { 0 }; //缓冲区
  95.  for (int i = 0; i < 5; i++) {*/
  96.  //clnt_sock = accept(serv_sock, (sockaddr*)&clnt_addr, &clnt_addr_size);//serv_sock接受
  97.  //int strLen = recv(clnt_sock, buffer, BUF_SIZE, 0); //接收客户端发来的数据
  98.  //send(clnt_sock, message, sizeof(message), 0); //将数据原样返回
  99.  //closesocket(clnt_sock); //关闭套接字
  100.  //memset(buffer, 0, BUF_SIZE); //重置缓冲区
  101.  //}
  102.  /*if (clnt_sock == INVALID_SOCKET)
  103.  {
  104.  error_handling("accept() error");
  105.  }
  106.  send(clnt_sock, message, sizeof(message), 0);
  107.  closesocket(clnt_sock);*/
  108.  Sleep(INFINITE);
  109.  closesocket(serv_sock);
  110.  WSACleanup();
  111.  return 0;
  112. }

客户端

控制台客户端(已实现)


   
   
  1. // socket_test_cilent.cpp: 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <io.h>
  8. #include <process.h>
  9. #include <winsock2.h>
  10. #include <windows.h>
  11. #include<ws2tcpip.h>
  12. #include <iostream>
  13. #pragma comment(lib, "ws2_32.lib")
  14. #include <Ws2tcpip.h>
  15. using namespace std;
  16. #define BUF_SIZE 5000
  17. void ErrorHandling(char* message);
  18. int main(int argc, char *argv[])
  19. {
  20.  SOCKET sock;
  21.  char bufSend[BUF_SIZE];
  22.  char bufRecv[BUF_SIZE];
  23.  sockaddr_in sockAddr;
  24.  char message[30];
  25.  if (argc != 3)
  26.  {
  27.  printf("Usage : %s <IP> <port>\n ", argv[0]);
  28.  exit(1);
  29.  }
  30.  //初始化DLL
  31.  WSADATA wsaData;
  32.  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  33.  ErrorHandling("WSAStartup() error!");
  34.  //向服务器发起请求
  35.  sock = socket(AF_INET, SOCK_STREAM, 0);
  36.  if (sock == INVALID_SOCKET)
  37.  {
  38.  WSACleanup();
  39.  ErrorHandling("socket() error");
  40.  }
  41.  memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
  42.  sockAddr.sin_family = PF_INET;
  43.  // sockAddr.sin_addr.s_addr = inet_addr(argv[1]);
  44.  InetPton(AF_INET, argv[1], &sockAddr.sin_addr);
  45.  sockAddr.sin_port = htons(atoi(argv[2]));
  46.  if (connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
  47.  {
  48.  if (sock != INVALID_SOCKET)
  49.  closesocket(sock);
  50.  WSACleanup();
  51.  ErrorHandling("connect() error");
  52.  }
  53.  else
  54.  {
  55.  printf("成功连接");
  56.  }
  57.  //获取用户输入的字符串并发送给服务器
  58.  printf("请输入要向服务器发送的信息:\n");
  59.  fd_set readSet;
  60.  struct timeval tv;
  61.  int ret, len;
  62.  while (1)
  63.  {
  64.  memset(bufSend, 0, 1000);
  65.  gets_s(bufSend);
  66.  if (!strcmp(bufSend, "quit\n") || !strcmp(bufSend, "QUIT\n") || !strcmp(bufSend, "Quit\n"))
  67.  {
  68.  WSACleanup(); //终止使用 DLL
  69.  printf("你已经退出");
  70.  exit(0);
  71.  }
  72.  len = strlen(bufSend);
  73.  if (len > 997)
  74.  len = 997;
  75.  bufSend[len] = '\r';
  76.  bufSend[len + 1] = '\n';
  77.  bufSend[len + 2] = 0;
  78.  ret = send(sock, bufSend, strlen(bufSend), 0);
  79.  if (ret == SOCKET_ERROR) {
  80.  printf("send:%d\n", WSAGetLastError());
  81.  break;
  82.  }
  83.  FD_ZERO(&readSet);
  84.  FD_SET(sock, &readSet);
  85.  tv.tv_sec = 3;
  86.  tv.tv_usec = 0;
  87.  ret = select(0, &readSet, NULL, NULL, NULL);
  88.  if (ret == SOCKET_ERROR) {
  89.  printf("select: %d", WSAGetLastError());
  90.  break;
  91.  }
  92.  if (ret == 0) {
  93.  printf("TimeOut,No Response From Server\n");
  94.  break;
  95.  }
  96.  if (FD_ISSET(sock, &readSet)) {
  97.  memset(bufRecv, 0, 1000);
  98.  ret = recv(sock, bufRecv, 1000, 0);
  99.  if (ret == SOCKET_ERROR) {
  100.  printf("recv: %d\n", WSAGetLastError());
  101.  break;
  102.  }
  103.  else
  104.  {
  105.  printf("%s\n", bufRecv);
  106.  }
  107.  }
  108.  if (sock != INVALID_SOCKET)
  109.  {
  110.  closesocket(sock);
  111.  }
  112.  }
  113.  WSACleanup();
  114.  printf("Stopped.\n");
  115.  return 0;
  116. }
  117. void ErrorHandling(char* message)
  118. {
  119.  fputs(message,stderr);
  120.  fputc('\n', stderr);
  121.  exit(1);
  122. }

测试 gif

服务器端测试.gif

调用图灵机器人(暂未实现)

能力有限,不知道怎么整合 MFC 程序和这个 winhttp 的程序整合


   
   
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <winhttp.h>
  4. #pragma comment(lib,"winhttp.lib")
  5. #define TULING_URL L"www.tuling123.com/openapi/api?key=这里换成你自己从图灵申请的API啦&info=%s"
  6. static wchar_t String[1024];
  7. //编码转换
  8. char *UnicodeToANSI(const wchar_t *str)
  9. {
  10.  static char result[1024];
  11.  int len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
  12.  WideCharToMultiByte(CP_ACP, 0, str, -1, result, len, NULL, NULL);
  13.  result[len] = '\0';
  14.  return result;
  15. }
  16. wchar_t *UTF8ToUnicode(const char *str)
  17. {
  18.  static wchar_t result[1024];
  19.  int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
  20.  MultiByteToWideChar(CP_UTF8, 0, str, -1, result, len);
  21.  result[len] = L'\0';
  22.  return result;
  23. }
  24. wchar_t *ANSIToUnicode(const char* str)
  25. {
  26.  int textlen;
  27.  static wchar_t result[1024];
  28.  textlen = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
  29.  memset(result, 0, sizeof(char) * (textlen + 1));
  30.  MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)result, textlen);
  31.  return result;
  32. }
  33. bool GetHttpPage(void)
  34. {
  35.  DWORD dwSize = 0;
  36.  DWORD dwDownloaded = 0;
  37.  LPSTR pszOutBuffer = NULL;
  38.  static HINTERNET hSession = WinHttpOpen(L"A Tuling API Example Program/1.0",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
  39.  static HINTERNET hConnect = NULL, hRequest = NULL;
  40.  BOOL bResults = FALSE;
  41.  //从控制台读出一行文字,注意读出来的内容是ANSI编码的,我们需要转换成 Unicode编码
  42.  static char uin[1024]; gets_s(uin);
  43.  wsprintf(String, TULING_URL, ANSIToUnicode(uin));
  44.  //建立一个http的连接会话,给出主机名就行,可以域名,也可以是IP地址,不需要http;前缀
  45.  if (hSession)
  46.  {
  47.  if (!hConnect)
  48.  hConnect = WinHttpConnect(hSession, L"www.tuling123.com", INTERNET_DEFAULT_HTTP_PORT, 0);
  49.  }
  50.  //创建一个HTTP请求句柄
  51.  if (hConnect)
  52.  hRequest = WinHttpOpenRequest(hConnect, L"GET", String, NULL, WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_ESCAPE_PERCENT | WINHTTP_FLAG_REFRESH);
  53.  //发送请求数据
  54.  if (hRequest)
  55.  bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0,0);
  56.  // 请求结束,接收数据
  57.  if (bResults)
  58.  bResults = WinHttpReceiveResponse(hRequest, NULL);
  59.  else
  60.  printf("Error %d has occurred.\n", GetLastError());
  61.  //如果返回值为false,可以使用getlasterror来得到错误信息,下同
  62.  //返回值的详细信息可以看微软网页,或者看这里翻译好的中文接口说明
  63.  //http://blog.csdn.net/fengsh998/article/details/8201591
  64.  // 内部使用的一个循环来确保能接受到所有数据
  65.  if (bResults)
  66.  {
  67.  do
  68.  {
  69.  //检查是否还有数据需要接收
  70.  dwSize = 0;
  71.  if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
  72.  {
  73.  printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());
  74.  break;
  75.  }
  76.  if (!dwSize)
  77.  break;
  78.  //为缓冲分配内存并读取
  79.  pszOutBuffer = new char[dwSize + 1];
  80.  if (!pszOutBuffer)
  81.  {
  82.  printf("Out of memory\n");
  83.  break;
  84.  }
  85.  ZeroMemory(pszOutBuffer, dwSize + 1);
  86.  if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
  87.  {
  88.  printf("Error %u in WinHttpReadData.\n", GetLastError());
  89.  }
  90.  else
  91.  {
  92.  //图灵api返回来的内容使用的是UTF-8编码,我们需要把它转换回ANSI才能在控制台显示
  93.  //printf("return:%s\n", UnicodeToANSI(UTF8ToUnicode(pszOutBuffer)) );
  94.  //因为没有使用JSON库,所以我暴力拆了这字符串。
  95.  pszOutBuffer[strlen(pszOutBuffer)-2] = '\0';
  96.  printf("小灵:%s\n\n", UnicodeToANSI(UTF8ToUnicode(pszOutBuffer)) + 23);
  97.  return true;
  98.  }
  99.  delete[] pszOutBuffer;
  100.  if (!dwDownloaded)
  101.  break;
  102.  } while (dwSize > 0);
  103.  }
  104.  //收尾,关闭被打开的句柄
  105.  if (hRequest) WinHttpCloseHandle(hRequest);
  106.  if (hConnect) WinHttpCloseHandle(hConnect);
  107.  if (hSession) WinHttpCloseHandle(hSession);
  108.  return false;
  109. }
  110. int main(void)
  111. {
  112.  system("color F0");
  113.  system("title 会聊天的图灵机器人 ●﹏●");
  114.  printf("\n 我是小灵,快来和我聊天吧! ●▽●\n\n");
  115.  do{ printf("我:"); } while (GetHttpPage());
  116.  system("pause");
  117.  return 0;
  118. }

客户端带界面版本(有问题,未调试)

客户端界面.png
发送按钮对应的实现代码


   
   
  1. void Csocket_clientDlg::OnBnClickedButton2()
  2. {
  3.  // TODO: 在此添加控件通知处理程序代码
  4.  UpdateData(true);
  5.  char *ip = m_edit_servaddr.GetBuffer(0);
  6.  char *port = m_edit_servport.GetBuffer(0);
  7.  char *argv[] = { "main.exe",ip,port };
  8.  CString str;
  9.  m_chatedit.GetWindowTextA(str);
  10.  string str1 = str.GetBuffer(0);
  11.  strcpy_s(bufSend, str1.c_str());
  12.  UpdateData(false);
  13.  main(3, argv);
  14. }

主要代码


   
   
  1. void ErrorHandling(char* message);
  2. int main(int argc, char *argv[])
  3. {
  4.  Csocket_clientDlg mfc;
  5.  SOCKET sock;
  6.  sockaddr_in sockAddr;
  7.  if (argc != 3)
  8.  {
  9.  //printf("Usage : %s <IP> <port>\n ", argv[0]);
  10.  AfxMessageBox("Usage : main.exe <IP> <port>\n ");
  11.  exit(1);
  12.  }
  13.  //初始化DLL
  14.  WSADATA wsaData;
  15.  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  16.  ErrorHandling("WSAStartup() error!");
  17.  //向服务器发起请求
  18.  sock = socket(AF_INET, SOCK_STREAM, 0);
  19.  if (sock == INVALID_SOCKET)
  20.  {
  21.  WSACleanup();
  22.  ErrorHandling("socket() error");
  23.  }
  24.  memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
  25.  sockAddr.sin_family = PF_INET;
  26.  // sockAddr.sin_addr.s_addr = inet_addr(argv[1]);
  27.  InetPton(AF_INET, argv[1], &sockAddr.sin_addr);
  28.  sockAddr.sin_port = htons(atoi(argv[2]));
  29.  if (connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
  30.  {
  31.  if (sock != INVALID_SOCKET)
  32.  closesocket(sock);
  33.  WSACleanup();
  34.  ErrorHandling("connect() error");
  35.  }
  36.  else
  37.  {
  38.  //printf("成功连接");
  39.  AfxMessageBox("成功连接");
  40.  }
  41.  fd_set readSet;
  42.  struct timeval tv;
  43.  int ret, len;
  44.  while (1)
  45.  {
  46.  if (!strcmp(bufSend, "quit\n") || !strcmp(bufSend, "QUIT\n") || !strcmp(bufSend, "Quit\n"))
  47.  {
  48.  WSACleanup(); //终止使用 DLL
  49.  AfxMessageBox("你已经退出");
  50.  exit(0);
  51.  }
  52.  len = strlen(bufSend);
  53.  if (len > 997)
  54.  len = 997;
  55.  bufSend[len] = '\r';
  56.  bufSend[len + 1] = '\n';
  57.  bufSend[len + 2] = 0;
  58.  ret = send(sock, bufSend, strlen(bufSend), 0);
  59.  if (ret == SOCKET_ERROR) {
  60.  AfxMessageBox("send:%d\n", WSAGetLastError());
  61.  break;
  62.  }
  63.  FD_ZERO(&readSet);
  64.  FD_SET(sock, &readSet);
  65.  tv.tv_sec = 3;
  66.  tv.tv_usec = 0;
  67.  ret = select(0, &readSet, NULL, NULL, NULL);
  68.  if (ret == SOCKET_ERROR) {
  69.  AfxMessageBox("select: %d", WSAGetLastError());
  70.  break;
  71.  }
  72.  if (ret == 0) {
  73.  AfxMessageBox("TimeOut,No Response From Server\n");
  74.  break;
  75.  }
  76.  if (FD_ISSET(sock, &readSet)) {
  77.  memset(bufRecv, 0, 1000);
  78.  ret = recv(sock, bufRecv, 1000, 0);
  79.  if (ret == SOCKET_ERROR) {
  80.  AfxMessageBox("recv: %d\n", WSAGetLastError());
  81.  break;
  82.  }
  83.  else
  84.  {
  85.  mfc.m_chatlog.SetSel(-1, -1);
  86.  mfc.m_chatlog.ReplaceSel((LPCTSTR)bufRecv);
  87.  }
  88.  }
  89.  if (sock != INVALID_SOCKET)
  90.  {
  91.  closesocket(sock);
  92.  }
  93.  }
  94.  WSACleanup();
  95.  AfxMessageBox("Stopped.\n");
  96.  return 0;
  97. }
  98. void ErrorHandling(char* message)
  99. {
  100.  AfxMessageBox(message);
  101.  exit(1);
  102. }

头文件

stdafx.h


   
   
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <WinSock2.h>
  4. #include <Windows.h>
  5. #pragma comment(lib, "ws2_32.lib")
  6. #include <Ws2tcpip.h>
  7. void ErrorHandling(char* message);
  8. extern SOCKET sock;
  9. #define BUF_SIZE 5000
  10. #include <iostream>
  11. using namespace std;
  12. extern char bufSend[BUF_SIZE];
  13. extern char bufRecv[BUF_SIZE];
  14. extern sockaddr_in sockAddr;
  15. extern int count;

stdafx.cpp


   
   
  1. SOCKET sock;
  2. char bufSend[BUF_SIZE] = { 0 };
  3. char bufRecv[BUF_SIZE] = { 0 };
  4. sockaddr_in sockAddr;
  5. int count=0;

第二章

客户端界面

第二章界面.png
连接按钮对应代码


   
   
  1.  char *ip = m_addr.GetBuffer(0);
  2.  char *port = m_port.GetBuffer(0);
  3.  UpdateData(false);
  4.  char *argv[] = { "main.exe",ip,port };
  5.  main(3, argv);

主程序代码


   
   
  1. void ErrorHandling(char* message);
  2. int main(int argc, char *argv[])
  3. {
  4.  CTCPsocketDlg mfc;
  5.  SOCKET sock;
  6.  sockaddr_in sockAddr;
  7.  if (argc != 3)
  8.  {
  9.  //printf("Usage : %s <IP> <port>\n ", argv[0]);
  10.  AfxMessageBox("Usage : main.exe <IP> <port>\n ");
  11.  exit(1);
  12.  }
  13.  //初始化DLL
  14.  WSADATA wsaData;
  15.  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  16.  ErrorHandling("WSAStartup() error!");
  17.  //向服务器发起请求
  18.  char message[30];
  19.  int strlen = 0;
  20.  int idx = 0, readlen = 0;
  21.  sock = socket(AF_INET, SOCK_STREAM, 0);
  22.  if (sock == INVALID_SOCKET)
  23.  {
  24.  WSACleanup();
  25.  ErrorHandling("socket() error");
  26.  }
  27.  memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
  28.  sockAddr.sin_family = PF_INET;
  29. // sockAddr.sin_addr.s_addr = inet_addr(argv[1]);
  30.  InetPton(AF_INET, argv[1], &sockAddr.sin_addr);
  31.  sockAddr.sin_port = htons(atoi(argv[2]));
  32.  if (connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
  33.  {
  34.  /*if (sock != INVALID_SOCKET)
  35.  closesocket(sock);
  36.  WSACleanup();*/
  37.  ErrorHandling("connect() error");
  38.  }
  39.  /*else
  40.  {
  41.  //printf("成功连接");
  42.  AfxMessageBox("成功连接");
  43.  }*/
  44.  while (readlen = recv(sock, &message[idx++], 1, 0))
  45.  {
  46.  if (readlen == -1)
  47.  ErrorHandling("read() error!");
  48.  strlen+= readlen;
  49.  }
  50.  mfc.m_mess = message;
  51.  mfc.m_read_count = strlen;
  52.  closesocket(sock);
  53.  WSACleanup();
  54.  return 0;
  55. }
  56. void ErrorHandling(char* message)
  57. {
  58.  AfxMessageBox(message);
  59.  exit(1);
  60. }

35 页第 6 题


   
   
  1. 将客户端内的
  2. while (readlen = recv(sock, &message[idx++], 1, 0))
  3.  {
  4.  if (readlen == -1)
  5.  ErrorHandling("read() error!");
  6.  strlen+= readlen;
  7.  }
  8. 改为
  9.  for(int i=0;i<3000:i++)
  10.  printf("write Busy");
  11. while (readlen = recv(sock, &message[idx++], strlen(message), 0))
  12.  {
  13.  if (readlen == -1)
  14.  ErrorHandling("read() error!");
  15.  strlen+= readlen;
  16.  }

   
   
  1. 将服务器端内的
  2.  send(sock,message,strlen(message),0);
  3.  改为
  4.  if(strlen(message)>0)
  5.  for(int i=0;i<strlen(message);i++)
  6.  write(sock,message,1,0)
  7.  else
  8.  printf("write() error!");

总结


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值