聊天不在其他电脑上工作

时间:2014-04-04 09:14:23

标签: c++ networking visual-studio-2013 chat winsock2

我的服务器 - 客户端聊天程序有问题。

我的问题是当我尝试在其他计算机上运行它时! 事实上 1.我试图用本地主机或IP运行它,但只能在我的电脑上运行,一切正常。 2.我试图在2台PC上运行(在同一网络上) 3.我试图在2台PC上(在不同的网络上)运行它

2和3的情况没有运行:(

我使用的是WinSock2

服务器聊天:

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <cstdlib>
#include <string>

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_PORT "1234"

using namespace std;

SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
SOCKET* Connessioni;

SOCKADDR_IN service;

int nConn = 0;
struct Buffer
{
    char nickname[21];
    int ID;
    char messaggio[1024];
};

int ServerThread(int ID, char generico[21] = {0}){
    Buffer client;
    bool salve = false;
    char* Recv = new char[1024];
    char* Send = new char[1024];
    char* RiceviNick = new char[21];
    ZeroMemory(Recv, 1024);
    ZeroMemory(Send, 1024);
    ZeroMemory(RiceviNick, 21);
    for (;;){
        recv(Connessioni[ID], RiceviNick, 21, NULL);
        if ( recv(Connessioni[ID], Recv, 1024, NULL) >= 0 )//recv 2
        {
            int check_socket = 0;
            client.ID = ID;

        //  cout << RiceviNick << "<<---";
            memcpy(client.nickname, RiceviNick, 21);
            memcpy(client.messaggio, Recv, 1024);
            memcpy(Send, &client.messaggio, 1024);
            ZeroMemory(RiceviNick, 21);
            memcpy(RiceviNick, &client.nickname, 21);

        //  cout << client.nickname << "<<---";
            for (; check_socket != nConn; check_socket++){

                if (Connessioni[check_socket] == Connessioni[ID]){}

                else
                {
                    send(Connessioni[check_socket], RiceviNick, 21, NULL);
                    send(Connessioni[check_socket], Send, 1024,NULL);
                     //send 5
                } //send 3

            }

            ZeroMemory(Recv, 1024);
            ZeroMemory(Send, 1024);
            ZeroMemory(RiceviNick, 21);

        } 


        else{ shutdown(Connessioni[ID], MSG_WAITALL); cout << "connessione terminata" << endl; break; };

    }

    return 0;
}

int initSock(){
    int RetVal = 0;
    WSAData wsaData;
    WORD DllVersion = MAKEWORD(2, 2);
    RetVal = WSAStartup(DllVersion, &wsaData);
    if (RetVal != 0)
        MessageBoxA(NULL, "WSA error, please retry", "Error", MB_OK | MB_ICONERROR);
    return RetVal;
}


int main()
{
    WSAData wsaData;
    struct addrinfo *result = NULL, *ptr = NULL, hints;

    initSock();

    ZeroMemory(&hints, sizeof (hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    //gethostbyname

    int controllo_struct = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (controllo_struct != 0)
    {
        MessageBoxA(NULL, "getinfo failes \n", "Error", MB_OK | MB_ICONERROR); 
        cout << WSAGetLastError() << " " << controllo_struct;
        getchar();
        WSACleanup();
        return 1;
    }

    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET)
    {
        MessageBoxA(NULL, "Error at Socket, please retry \n", "Error", MB_OK | MB_ICONERROR);
        freeaddrinfo(result);
        WSACleanup();
    }

    WSAStartup(MAKEWORD(2, 2), &wsaData);


    int controllo_bind = bind(ListenSocket, result->ai_addr, result->ai_addrlen);
    if (controllo_bind == SOCKET_ERROR)
    {
        MessageBoxA(NULL, "bind ha fallito \n", "Error", MB_OK | MB_ICONERROR);
        cout << controllo_bind << " ! " << SOCKET_ERROR << endl;
        getchar();
        cout << WSAGetLastError() << endl;
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    if (listen(ListenSocket, 64) == SOCKET_ERROR){
        MessageBoxA(NULL, "Listen ha fallito \n", "Error", MB_OK | MB_ICONERROR);
        cout << WSAGetLastError() << endl;
        closesocket(ListenSocket);
        return 1;
    }

    ClientSocket = INVALID_SOCKET;

    int addrlen = sizeof(hints);
    Connessioni = (SOCKET*)calloc(64, sizeof(SOCKET));

    for (;;){

        if (ClientSocket = accept(ListenSocket, (SOCKADDR*)&hints, &addrlen))
        {
            cout << "connessione accettata" << endl;
            Connessioni[nConn] = ClientSocket;
            char* nick = new char[20];
            ZeroMemory(nick, sizeof(nick));
            itoa(nConn, nick, 10);

            send(Connessioni[nConn], nick, sizeof(nick), NULL); //send 1
            nConn++;

            CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ServerThread, (LPVOID)(nConn - 1), NULL, NULL);
        }
    }

    return 0;
}

客户聊天:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#pragma comment(lib, "Ws2_32.lib")

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <cstdlib>
#include <cstdio>
#include <string>

using namespace std;

#define DEFAULT_PORT "1234"

int ParametroConnessione = 0;

WSADATA wsaData;
WORD DllVersion = MAKEWORD(2, 2);

SOCKET ConnectSocket = INVALID_SOCKET;

struct Buffer{
    char nickname[21];
    int ID;
    char Message[1024];
};

int ClientThread(){
    Buffer client;
    bool we = false;
    char arrivo[1024] = { 0 };
    char arrivoN[21] = { 0 };
    for (;;){
        recv(ConnectSocket, arrivoN, 21, NULL);

        if (recv(ConnectSocket, arrivo, 1024, NULL)){ //recv 3 //recv 5

            memcpy(&client.nickname, arrivoN, 21); 
            memcpy(&client.Message, arrivo, 1024);

            string nicknameP(client.nickname);
            string messaggio(client.Message);
            if (nicknameP.size() == NULL)
                nicknameP = "NickName default n° " + client.ID;

            cout << "<Utente No: " << nicknameP << "> " << messaggio << endl;
            messaggio.resize(NULL);
        }
    }
    return 0;
}

int main(){

int iResult = 0;
struct addrinfo *result = NULL, *ptr = NULL, hints;

ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

iResult = WSAStartup(DllVersion, &wsaData);
if (iResult != 0){
    MessageBoxA(NULL, "WSA error, please retry", "Error", MB_OK | MB_ICONERROR);
}

iResult = getaddrinfo("127.0.0.1", DEFAULT_PORT, &hints, &result);
if (iResult != 0) {
    MessageBoxA(NULL, "getinfo error, please retry", "Error", MB_OK | MB_ICONERROR);
    cout << WSAGetLastError << " | " << iResult << endl;
    getchar();
    WSACleanup();
    return 1;
}

    ptr = result;
    result = NULL;
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
    if (ConnectSocket == INVALID_SOCKET) {
        MessageBoxA(NULL, "socket error, please retry", "Error", MB_OK | MB_ICONERROR);
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

    cout << "premi [ENTER] per connetterti al server: " << endl;
    getchar();
    ParametroConnessione = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (ParametroConnessione == SOCKET_ERROR) {
        MessageBoxA(NULL, "connection to server error, please retry", "Error", MB_OK | MB_ICONERROR);
        closesocket(ConnectSocket);
        ConnectSocket = INVALID_SOCKET;
    }

    freeaddrinfo(result);

    if (ParametroConnessione == SOCKET_ERROR){
        MessageBoxA(NULL, "Parametro connessione ha fallito, please retry", "Error", MB_OK | MB_ICONERROR);
        getchar();
    }

    int ID = 0;
    char* N = new char[20];
    ZeroMemory(N, 20);
    recv(ConnectSocket, N, 20, NULL); //recv 1
    ID = atoi(N);

    bool prova = false;

    if (ParametroConnessione >= 0)
    {
        cout << "connesso con successo come numero: " << ID << endl;


    }
    else{
        cout << "non ci si può connettere al server. il client sarà chiuso" << endl;
    }

    char* ProvvisorioNick = new char[21];

    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientThread, NULL, NULL, NULL);
    for (;;){


        if (!prova)
        {

            ZeroMemory(ProvvisorioNick, 21);
            cout << "nick" << endl;
            cin >> ProvvisorioNick;
            cin.ignore();
            //cout << ProvvisorioNick << "<<-----";
            prova = true;


        }
        send(ConnectSocket, ProvvisorioNick, 21, NULL); //send 4
        std::string tmp;
        tmp.resize(0);
        std::getline(std::cin, tmp);
        char* messaggio = new char[tmp.size()+1];
        //ZeroMemory(messaggio, tmp.size()+1);
        strcpy_s(messaggio, tmp.size()+1, tmp.c_str());
        //da rivedere!

        send(ConnectSocket, messaggio, tmp.size()+1, NULL); //Send 2

        tmp.resize(0);
        delete messaggio;
    }

    return 0;
}

我的问题是: 我如何修复此算法以在2个不同的PC上的不同网络上使用我的聊天?

重要!!! OBV我使用我的IP不是“127.0.0.1”

0 个答案:

没有答案