VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2121|回复: 4

[已解决]Socket 编程 TCP 跨机通信

[复制链接]
74_avatar_middle
最佳答案
7 
在线会员 发表于 2021-7-22 21:12:39 | 显示全部楼层 |阅读模式
本帖最后由 User_Ghost 于 2021-7-22 21:16 编辑

服务端和客户端是可以连上的,但是只能在同一台电脑连。所以我想问问该怎么让服务端和客户端在两台不同的电脑上运行(网络已经连同一个了,并且只要在局域网内就行了,跨出局域网等以后再学)。谢谢!

家里网络查出来,一台电脑是192.168.0.103,一台是192.168.0.104
【注:代码里有点小BUG,还没修复,就是客户端在连接成功后"Command: "作为提示语会输出两遍,然后服务端向客户端发送信息时,能发送,但客户端收到的是空的,这些小问题可以忽略掉,再次感谢!】

服务端代码:
  1. #include "header.h"

  2. int main()
  3. {
  4.         WSADATA wsaData;
  5.         WORD wVersion = MAKEWORD(2, 2);
  6.         DWORD dwRes = WSAStartup(wVersion, &wsaData);
  7.         if (dwRes != 0)
  8.         {
  9.                 printf_s("Failed to init the environment.\r\n");
  10.                 WSACleanup();
  11.                 system("pause");
  12.                 return 0;
  13.         }

  14.         unsigned short uPspt{ 1200 };

  15.         SOCKET sockServer = INVALID_SOCKET;
  16.         sockaddr_in addrServer;
  17.         addrServer.sin_family = AF_INET;
  18.         addrServer.sin_port = htons(uPspt);
  19.         inet_pton(AF_INET, "192.168.0.104", (void*)&addrServer.sin_addr); //ipconfig查出来IP是这个,用127.0.0.1也试了
  20.         sockServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  21.         if (sockServer == INVALID_SOCKET)
  22.         {
  23.                 printf_s("Failed to create socket.\r\n");
  24.                 WSACleanup();
  25.                 system("pause");
  26.                 return 0;
  27.         }
  28.         bind(sockServer, (sockaddr*)&addrServer, sizeof(addrServer));
  29.         listen(sockServer, 10);

  30.         sockaddr_in addrClient{};
  31.         int iLen = sizeof(addrClient);
  32.         SOCKET sockClient = accept(sockServer, (sockaddr*)&addrClient, &iLen);
  33.         if (sockClient == INVALID_SOCKET)
  34.         {
  35.                 printf_s("Failed to connect to the client.\r\n");
  36.                 closesocket(sockServer);
  37.                 WSACleanup();
  38.                 system("pause");
  39.                 return 0;
  40.         }

  41.         printf_s("Connected client successfully.\r\n");

  42.         while (true)
  43.         {
  44.                 char msg[256]{};
  45.                 recv(sockClient, msg, sizeof(msg), 0);
  46.                 char ipClient[20];
  47.                 inet_ntop(AF_INET, (void*)&sockClient, ipClient, 20);
  48.                 printf_s("Client(%s:%d)\r\n  - %s\r\n\r\n", ipClient, uPspt, msg);

  49.                 printf_s("Command: ");
  50.                 char input[256] = { '\0' };
  51.                 cin.getline(input, 256);
  52.                 string cmd;
  53.                 string in(input);
  54.                
  55.                 cmd = in.substr(0, 4);
  56.                
  57.                 if (cmd == "send")
  58.                 {
  59.                         string strMsg = in.substr(5, 256);
  60.                         const char *c_msg = strMsg.c_str();
  61.                         send(sockClient, c_msg, strlen(c_msg) * sizeof(char), 0);
  62.                 }
  63.                 if (cmd == "exit")
  64.                 {
  65.                         break;
  66.                 }
  67.         }

  68.         closesocket(sockServer);
  69.         WSACleanup();

  70.         return 0;
  71. }
复制代码


客户端代码:
  1. #include "header.h"

  2. int main()
  3. {
  4.         WSADATA wsaData;
  5.         WORD dwVersion = MAKEWORD(2, 2);
  6.         DWORD dwRes = WSAStartup(dwVersion, &wsaData);
  7.         if (dwRes != NULL)
  8.         {
  9.                 printf_s("Failed to init the environment.\r\n");
  10.                 system("pause");
  11.                 return 0;
  12.         }

  13.         char ip[20]{};
  14.         unsigned short uPspt{ 1200 };
  15.         SOCKET sockClient = INVALID_SOCKET;
  16.         sockaddr_in addrServer;
  17.         printf_s("Input Server's IP: ");
  18.         scanf_s("%s", ip, 20);
  19.         //printf_s("Input the Passport: ");
  20.         //scanf_s("%u", &uPspt);
  21.         
  22.         addrServer.sin_family = PF_INET;
  23.         addrServer.sin_port = htons(uPspt);
  24.         inet_pton(PF_INET, ip, (void*)&addrServer.sin_addr); //在这里用输入的IP作为地址
  25.         sockClient = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  26.         if (sockClient == INVALID_SOCKET)
  27.         {
  28.                 printf_s("Failed to create client's socket.\r\n");
  29.                 system("pause");
  30.                 return 0;
  31.         }

  32.         if (connect(sockClient, (sockaddr*)&addrServer, sizeof(addrServer)) == SOCKET_ERROR)
  33.         {
  34.                 printf_s("Failed to connect to the server.\r\n");
  35.                 closesocket(sockClient);
  36.                 WSACleanup();
  37.                 system("pause");
  38.                 return 0;
  39.         }

  40.         printf_s("Succeeded in connecting to the server( %s:%d )\r\n\r\n", ip, uPspt);

  41.         while (true)
  42.         {
  43.                 char in[256]{};
  44.                 printf_s("Command: ");
  45.                 cin.getline(in, 256);
  46.                 string input(in);
  47.                 string cmd;
  48.                 cmd = input.substr(0, 4);
  49.                 if (cmd == "send")
  50.                 {
  51.                         string msg;
  52.                         msg = input.substr(5, 256);
  53.                         const char* lpMsg = msg.c_str();
  54.                         send(sockClient, lpMsg, strlen(lpMsg) * sizeof(char), 0);

  55.                         char reply[256]{};
  56.                         recv(sockClient, reply, strlen(reply) * sizeof(char), 0);
  57.                         printf_s("Server(%s:%d):\r\n  - %s\r\n\r\n", ip, uPspt, reply);
  58.                 }
  59.                 else if (cmd == "exit")
  60.                 {
  61.                         break;
  62.                 }
  63.         }
  64.         
  65.         closesocket(sockClient);
  66.         WSACleanup();

  67.         return 0;
  68. }

  69. /*\
  70. * Command List:
  71. * send
  72. * exit
  73. */
复制代码
最佳答案
98_avatar_small
2021-7-26 22:23:31
这个只要你独立IP就可以了,外网你要独立IP,如果你没有买服务器,基本上自家用的宽带都是内网IP,所以不可能连接上。自己可以买一台服务器跑一下程序就可以了。然后防火墙要开发端口




上一篇:通信问题
下一篇:MFC 实现计算器加法
98_avatar_middle
最佳答案
1 
online_moderator 发表于 2021-7-26 22:23:31 | 显示全部楼层    本楼为最佳答案   
bestAnswer
这个只要你独立IP就可以了,外网你要独立IP,如果你没有买服务器,基本上自家用的宽带都是内网IP,所以不可能连接上。自己可以买一台服务器跑一下程序就可以了。然后防火墙要开发端口
20_avatar_middle
最佳答案
0 
在线会员 发表于 2021-7-30 16:59:27 | 显示全部楼层
谢谢分享!
74_avatar_middle
最佳答案
7 
ico_lz  楼主| 发表于 2021-7-31 22:53:21 | 显示全部楼层
小鱼儿 发表于 2021-7-26 22:23
这个只要你独立IP就可以了,外网你要独立IP,如果你没有买服务器,基本上自家用的宽带都是内网IP,所以不可 ...

啊不好意思,因为太久没人回答我忘记看了。

我是觉得syc老大的课里是利用socket选择模型实现的局域网通信,那么不用选择模型,仅仅用阻塞模式的数据收发理论上也是可以的。不过听您的解释,或许是因为IP的问题,那我理解的意思就是,只要IP问题解决那么这个程序就能实现。

非常感谢!
68_avatar_middle
最佳答案
0 
在线会员 发表于 2021-8-3 00:28:56 | 显示全部楼层
你需要两个线程 之后一个线程永远accept 另一个线程循环read所有socket
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-8 18:23

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表