[关闭]
@rg070836rg 2017-01-09T23:27:49.000000Z 字数 2286 阅读 1261

TCP_IP第三次作业

TCP_IP


由于自己的偷懒,现在才开始补作业。
2017年1月9日22点

第三次 写一个具有服务器以及客户端的程序(远程控制)

服务器端设计

bind函数

  1. int Bind(const char* ip, int port) {
  2. //创建tcp套接字
  3. int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  4. //允许创建端口号相同但IP地址不同的多个socket描述符
  5. int opt = 1;
  6. setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  7. //将套接字和IP、端口绑定
  8. struct sockaddr_in serv_addr;
  9. memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
  10. serv_addr.sin_family = AF_INET; //使用IPv4地址
  11. serv_addr.sin_addr.s_addr = inet_addr(ip); //具体的IP地址
  12. serv_addr.sin_port = htons(port); //端口
  13. if(-1 == bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) {
  14. std::string str("Error bind on");
  15. char s[6];
  16. sprintf(s, "%d", port);
  17. str = str+ip+":"+s;
  18. perror(str.c_str());
  19. return -1;
  20. } else {
  21. printf("成功绑定端口%s:%d\n", ip, port);
  22. }
  23. return serv_sock;
  24. }

开启服务器,监听客户端请求

  1. void server_run(const char* ip, int port) {
  2. int serv_sock = Bind(ip, port);
  3. if(serv_sock == -1) {
  4. return;
  5. }
  6. //进入监听状态,等待用户发起请求
  7. listen(serv_sock, 20);
  8. //接收客户端请求
  9. sockaddr_in clnt_addr;
  10. socklen_t clnt_addr_size = sizeof(clnt_addr);
  11. char str[] = "Hello World!";
  12. char strip[32];
  13. char buffer[40];
  14. int clnt_sock;
  15. while((clnt_sock = accept(serv_sock, (sockaddr*)&clnt_addr, &clnt_addr_size)) >= 0) {
  16. // 向客户端发送数据
  17. write(clnt_sock, str, sizeof(str));
  18. //进行处理,这边不具体写了!可以多线程,也可以单线程,这里不写了!
  19. }
  20. //关闭套接字
  21. close(serv_sock);
  22. }

开启服务端

开启方式,按照下面的,就可以开启了,不过服务器端的业务逻辑没写,所以程序是跑不了的

  1. const char *ip = "127.0.0.1";
  2. int port = 12344;
  3. server_run(ip, port);

客户端设计

客户端只需要创建套接字,与服务器相连,反而容易设计:

  1. void client_run_cmd(const char* ip, int port) {
  2. //创建套接字
  3. int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  4. //向服务器(特定的IP和端口)发起请求
  5. struct sockaddr_in serv_addr;
  6. memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
  7. serv_addr.sin_family = AF_INET; //使用IPv4地址
  8. serv_addr.sin_addr.s_addr = inet_addr(ip); //具体的IP地址
  9. serv_addr.sin_port = htons(port); //端口
  10. if(-1 == connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) {
  11. std::string str("Error connect on");
  12. char s[6];
  13. sprintf(s, "%d", port);
  14. str = str+ip+":"+s;
  15. perror(str.c_str());
  16. return;
  17. } else {
  18. printf("Success connected on %s:%d\n", ip, port);
  19. }
  20. char buffer[1024];
  21. int bufsize = 1024;
  22. int maxfd = sock, rRes, wRes, r1Res;
  23. fd_set sockSet, inSet, rSet, wSet, r1Set;
  24. struct timeval timeout;
  25. timeout.tv_sec = 0;
  26. timeout.tv_usec = 1000;
  27. FD_ZERO(&sockSet);
  28. FD_ZERO(&inSet);
  29. FD_SET(sock, &sockSet);
  30. FD_SET(STDIN_FILENO, &inSet);
  31. bool cmdflag = false, receiveing = false;
  32. char* cmdbuf[20];
  33. int cmdbuflen;
  34. // int memflen = 1024*1024*4;
  35. // char memfile[memflen];
  36. FILE * pfile;
  37. char rfilename[50];
  38. char wBuffer[1024];
  39. while(1) {
  40. //业务逻辑处理,不写了
  41. }
  42. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注