|
本帖最后由 User_Ghost 于 2021-7-22 21:16 编辑
服务端和客户端是可以连上的,但是只能在同一台电脑连。所以我想问问该怎么让服务端和客户端在两台不同的电脑上运行(网络已经连同一个了,并且只要在局域网内就行了,跨出局域网等以后再学)。谢谢!
家里网络查出来,一台电脑是192.168.0.103,一台是192.168.0.104
【注:代码里有点小BUG,还没修复,就是客户端在连接成功后"Command: "作为提示语会输出两遍,然后服务端向客户端发送信息时,能发送,但客户端收到的是空的,这些小问题可以忽略掉,再次感谢!】
服务端代码:
- #include "header.h"
- int main()
- {
- WSADATA wsaData;
- WORD wVersion = MAKEWORD(2, 2);
- DWORD dwRes = WSAStartup(wVersion, &wsaData);
- if (dwRes != 0)
- {
- printf_s("Failed to init the environment.\r\n");
- WSACleanup();
- system("pause");
- return 0;
- }
- unsigned short uPspt{ 1200 };
- SOCKET sockServer = INVALID_SOCKET;
- sockaddr_in addrServer;
- addrServer.sin_family = AF_INET;
- addrServer.sin_port = htons(uPspt);
- inet_pton(AF_INET, "192.168.0.104", (void*)&addrServer.sin_addr); //ipconfig查出来IP是这个,用127.0.0.1也试了
- sockServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sockServer == INVALID_SOCKET)
- {
- printf_s("Failed to create socket.\r\n");
- WSACleanup();
- system("pause");
- return 0;
- }
- bind(sockServer, (sockaddr*)&addrServer, sizeof(addrServer));
- listen(sockServer, 10);
- sockaddr_in addrClient{};
- int iLen = sizeof(addrClient);
- SOCKET sockClient = accept(sockServer, (sockaddr*)&addrClient, &iLen);
- if (sockClient == INVALID_SOCKET)
- {
- printf_s("Failed to connect to the client.\r\n");
- closesocket(sockServer);
- WSACleanup();
- system("pause");
- return 0;
- }
- printf_s("Connected client successfully.\r\n");
- while (true)
- {
- char msg[256]{};
- recv(sockClient, msg, sizeof(msg), 0);
- char ipClient[20];
- inet_ntop(AF_INET, (void*)&sockClient, ipClient, 20);
- printf_s("Client(%s:%d)\r\n - %s\r\n\r\n", ipClient, uPspt, msg);
- printf_s("Command: ");
- char input[256] = { '\0' };
- cin.getline(input, 256);
- string cmd;
- string in(input);
-
- cmd = in.substr(0, 4);
-
- if (cmd == "send")
- {
- string strMsg = in.substr(5, 256);
- const char *c_msg = strMsg.c_str();
- send(sockClient, c_msg, strlen(c_msg) * sizeof(char), 0);
- }
- if (cmd == "exit")
- {
- break;
- }
- }
- closesocket(sockServer);
- WSACleanup();
- return 0;
- }
复制代码
客户端代码:
- #include "header.h"
- int main()
- {
- WSADATA wsaData;
- WORD dwVersion = MAKEWORD(2, 2);
- DWORD dwRes = WSAStartup(dwVersion, &wsaData);
- if (dwRes != NULL)
- {
- printf_s("Failed to init the environment.\r\n");
- system("pause");
- return 0;
- }
- char ip[20]{};
- unsigned short uPspt{ 1200 };
- SOCKET sockClient = INVALID_SOCKET;
- sockaddr_in addrServer;
- printf_s("Input Server's IP: ");
- scanf_s("%s", ip, 20);
- //printf_s("Input the Passport: ");
- //scanf_s("%u", &uPspt);
-
- addrServer.sin_family = PF_INET;
- addrServer.sin_port = htons(uPspt);
- inet_pton(PF_INET, ip, (void*)&addrServer.sin_addr); //在这里用输入的IP作为地址
- sockClient = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sockClient == INVALID_SOCKET)
- {
- printf_s("Failed to create client's socket.\r\n");
- system("pause");
- return 0;
- }
- if (connect(sockClient, (sockaddr*)&addrServer, sizeof(addrServer)) == SOCKET_ERROR)
- {
- printf_s("Failed to connect to the server.\r\n");
- closesocket(sockClient);
- WSACleanup();
- system("pause");
- return 0;
- }
- printf_s("Succeeded in connecting to the server( %s:%d )\r\n\r\n", ip, uPspt);
- while (true)
- {
- char in[256]{};
- printf_s("Command: ");
- cin.getline(in, 256);
- string input(in);
- string cmd;
- cmd = input.substr(0, 4);
- if (cmd == "send")
- {
- string msg;
- msg = input.substr(5, 256);
- const char* lpMsg = msg.c_str();
- send(sockClient, lpMsg, strlen(lpMsg) * sizeof(char), 0);
- char reply[256]{};
- recv(sockClient, reply, strlen(reply) * sizeof(char), 0);
- printf_s("Server(%s:%d):\r\n - %s\r\n\r\n", ip, uPspt, reply);
- }
- else if (cmd == "exit")
- {
- break;
- }
- }
-
- closesocket(sockClient);
- WSACleanup();
- return 0;
- }
- /*\
- * Command List:
- * send
- * exit
- */
复制代码
这个只要你独立IP就可以了,外网你要独立IP,如果你没有买服务器,基本上自家用的宽带都是内网IP,所以不可能连接上。自己可以买一台服务器跑一下程序就可以了。然后防火墙要开发端口
|
上一篇: 通信问题下一篇: MFC 实现计算器加法
|