计算机网络作业(四)

计算机网络作业(四)

对socket编程我还是挺熟悉的,毕竟用过python写的shadowsocks,不过那时候时候没看过这个程序的源码,最近作业是做一个最多支持5线程的迭代服务器,最好能够支持智能回复,看了一下智能回复应该能用图灵机器人的API搞定,画出来的程序流程都大概如下所示:

IMG_20171019_210925.jpg

第一章:

服务器端

界面

界面.png

启动服务器按钮对应代码

###头文件 #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

主要代码

客户端

控制台客户端(已实现)

测试gif

服务器端测试.gif

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

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

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

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

主要代码

头文件

stdafx.h

stdafx.cpp

第二章

客户端界面

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

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

主程序代码

void ErrorHandling(char* message);

int main(int argc, char *argv[])
{
 CTCPsocketDlg mfc;
 SOCKET sock;
 sockaddr_in sockAddr;
 if (argc != 3)
 {
  //printf("Usage : %s <IP> <port>\n ", argv[0]);
  AfxMessageBox("Usage : main.exe <IP> <port>\n ");

  exit(1);
 }
 //初始化DLL
 WSADATA wsaData;
 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  ErrorHandling("WSAStartup() error!");
 //向服务器发起请求
 char message[30];
 int strlen = 0;
 int idx = 0, readlen = 0;
 sock = socket(AF_INET, SOCK_STREAM, 0);
 if (sock == INVALID_SOCKET)
 {
  WSACleanup();
  ErrorHandling("socket() error");

 }
 memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
 sockAddr.sin_family = PF_INET;
// sockAddr.sin_addr.s_addr = inet_addr(argv[1]);

 InetPton(AF_INET, argv[1], &sockAddr.sin_addr);
 sockAddr.sin_port = htons(atoi(argv[2]));
 if (connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
 {
  /*if (sock != INVALID_SOCKET)
   closesocket(sock);
  WSACleanup();*/
  ErrorHandling("connect() error");
 }
 /*else
 {
  //printf("成功连接");
  AfxMessageBox("成功连接");
 }*/
 while (readlen = recv(sock, &message[idx++], 1, 0))
 {
  if (readlen == -1)
   ErrorHandling("read() error!");
   strlen+= readlen;
 }
 mfc.m_mess = message;
 mfc.m_read_count = strlen;
 closesocket(sock);
 WSACleanup();
 return 0;

}
void ErrorHandling(char* message)
{
 AfxMessageBox(message);
 exit(1);
}

35页第6题

将客户端内的
while (readlen = recv(sock, &message[idx++], 1, 0))
 {
  if (readlen == -1)
   ErrorHandling("read() error!");
   strlen+= readlen;
 }
改为
 for(int i=0;i<3000:i++)
 printf("write Busy");
while (readlen = recv(sock, &message[idx++], strlen(message), 0))
 {
  if (readlen == -1)
   ErrorHandling("read() error!");
   strlen+= readlen;
 }
将服务器端内的
 send(sock,message,strlen(message),0);
 改为
  if(strlen(message)>0)
  for(int i=0;i<strlen(message);i++)
 write(sock,message,1,0)
  else
  printf("write() error!");

总结

我再也不想用mfc工程写GUI界面了。

评论

  1. If the payout channel had filled up, the payout became extra beneficiant; if nearly empty, the payout turned less so . With microprocessors now ubiquitous, the computer systems inside fashionable slot machines permit producers 우리카지노 to assign a different probability to every image on every reel. To the player, it'd appear that a successful image was "so shut", whereas in reality the probability is way lower.

    回复删除

发表评论

此博客中的热门博文

Qbittorent下载完成后自动上传谷歌网盘脚本

记一次被骗的经历

由txt文件制作带目录的kindle电子书