我的服务器 - 客户端聊天程序有问题。
我的问题是当我尝试在其他计算机上运行它时! 事实上 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”