如何使此代码适用于不同计算机上的服务器和客户端



Server

#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <winsock2.h>
#include <fstream>
#include <stdio.h>
#include <string>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define BUFLEN 512  //Max length of buffer
#define PORT 8888   //The port on which to listen for incoming data
using namespace std;
int main()
{
    SOCKET s;
    struct sockaddr_in server, si_other;
    int slen, recv_len;
    char buf[BUFLEN];
    WSADATA wsa;
    slen = sizeof(si_other);
    //Initialise winsock
    printf("nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    printf("Initialised.n");
    //Create a socket
    if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
    }
    printf("Socket created.n");
    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(PORT);
    //Bind
    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    puts("Bind done");
    //keep listening for data
    while (1)
    {
        printf("Waiting for data...");
        fflush(stdout);
        //clear the buffer by filling null, it might have previously received data
        memset(buf, '', BUFLEN);
        //try to receive some data, this is a blocking call
        if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
        {
            printf("recvfrom() failed with error code : %d", WSAGetLastError());
            exit(EXIT_FAILURE);
        }
        //print details of the client/peer and the data received
        printf("Received packet from %s:%dn", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
        printf("Data: %sn", buf);
        //now reply the client with the same data
        if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
        {
            printf("sendto() failed with error code : %d", WSAGetLastError());
            exit(EXIT_FAILURE);
        }
    }
    closesocket(s);
    WSACleanup();
    /*string line;
    ifstream myfile("info.xml");
    if (myfile.is_open())
    {
        while (getline(myfile, line))
        {
            cout << line << 'n';
        }
        myfile.close();
    }
    else
    {
        cout << "unable to open file";
    }*/
    return 0;
}

客户

#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define SERVER "127.0.0.1"  //ip address of udp server
#define BUFLEN 512  //Max length of buffer
#define PORT 8888   //The port on which to listen for incoming data
int main(void)
{
    struct sockaddr_in si_other;
    int s, slen = sizeof(si_other);
    char buf[BUFLEN];
    char message[BUFLEN];
    WSADATA wsa;
    //Initialise winsock
    printf("nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    printf("Initialised.n");
    //create socket
    if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
    {
        printf("socket() failed with error code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    //setup address structure
    memset((char *)&si_other, 0, sizeof(si_other));
    si_other.sin_family = AF_INET;
    si_other.sin_port = htons(PORT);
    si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
    //start communication
    while (1)
    {
        printf("Enter message : ");
        //gets(message);
        fgets(message, BUFLEN, stdin);
        //send the message
        if (sendto(s, message, strlen(message), 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
        {
            printf("sendto() failed with error code : %d", WSAGetLastError());
            exit(EXIT_FAILURE);
        }
        //receive a reply and print it
        //clear the buffer by filling null, it might have previously received data
        memset(buf, '', BUFLEN);
        //try to receive some data, this is a blocking call
        if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)
        {
            printf("recvfrom() failed with error code : %d", WSAGetLastError());
            exit(EXIT_FAILURE);
        }
        puts(buf);
    }
    closesocket(s);
    WSACleanup();
    return 0;
}

如果服务器和客户端代码在同一台计算机上运行,则它有效。我想知道如果我想让它适用于两台不同的机器,我需要改变什么?两台机器都连接到同一个WIFI,运行Windows 10。在C++和网络方面,我是一个菜鸟,请放轻松,谢谢。

在客户端代码上,#define SERVER "127.0.0.1"表示服务器位于本地主机上。

您可以检查服务器 IP 是什么(例如从命令提示符使用 ipconfig),并设置SERVER宏。

请注意,您可能需要执行一些配置工作,例如在防火墙中打开端口。

首先,您应该检查两台机器之间的连接,您可以使用目标IP使用ping命令

进行操作