이 코드는 네트워크에서 잘 작동하지만 친구 네트워크에서는 잘 작동합니다. 클라이언트가 내 친구의 호스트에 연결할 수 없습니다. 내 네트워크의 기본 게이트웨이는 10.0.1.1이고 서브넷 마스크는 255.255.255.0입니다. 내 친구의 기본 게이트웨이는 192.168.1.1이고 서브넷 마스크는 같습니다. 그건 그렇고, 이것들은 무선 네트워크 연결상의 무선 LAN 어댑터를위한 IP입니다. 내 친구의 네트워크에서 클라이언트 소켓과 서버 소켓 모두 잘 초기화되지만 서로 연결하지 않습니다. 같은 컴퓨터에서 호스트와 클라이언트를 실행하면 서로 연결되지만 다른 컴퓨터에서는 연결되지 않습니다. 하나 개는 내 네트워크, 두 컴퓨터가 하나 하나 WIN7를 실행하고, 자신에 윈도우 7을 실행하는 것은 승리 Vista를 실행하는Winsock C++ 응용 프로그램이 일부 네트워크에서 작동하지 않습니다.
//Socket.h
#pragma once
#include <iostream>
#include "WinSock2.h"
using namespace std;
const int STRLEN = 256;
class Socket
{
protected:
WSADATA wsaData;
SOCKET mySocket;
SOCKET myBackup;
SOCKET acceptSocket;
sockaddr_in myAddress;
public:
Socket();
~Socket();
bool SendData(char*);
bool RecvData(char*, int);
void CloseConnection();
void GetAndSendMessage();
};
class ServerSocket : public Socket
{
public:
void Listen();
void Bind(int port);
void StartHosting(int port);
};
class ClientSocket : public Socket
{
public:
void ConnectToServer(const char *ipAddress, int port);
};
//Socket.cpp
#include "Socket.h"
Socket::Socket()
{
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR)
{
cerr<<"Socket Initialization: Error with WSAStartup\n";
system("pause");
WSACleanup();
exit(10);
}
//Create a socket
mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mySocket == INVALID_SOCKET)
{
cerr<<"Socket Initialization: Error creating socket"<<endl;
system("pause");
WSACleanup();
exit(11);
}
myBackup = mySocket;
}
Socket::~Socket()
{
WSACleanup();
}
bool Socket::SendData(char *buffer)
{
send(mySocket, buffer, strlen(buffer), 0);
return true;
}
bool Socket::RecvData(char *buffer, int size)
{
int i = recv(mySocket, buffer, size, 0);
buffer[i] = '\0';
return true;
}
void Socket::CloseConnection()
{
//cout<<"CLOSE CONNECTION"<<endl;
closesocket(mySocket);
mySocket = myBackup;
}
void Socket::GetAndSendMessage()
{
char message[STRLEN];
cin.ignore();
cout<<"Send > ";
cin.get(message, STRLEN);
SendData(message);
}
void ServerSocket::StartHosting(int port)
{
Bind(port);
Listen();
}
void ServerSocket::Listen()
{
//cout<<"LISTEN FOR CLIENT..."<<endl;
if (listen (mySocket, 1) == SOCKET_ERROR)
{
cerr<<"ServerSocket: Error listening on socket\n";
system("pause");
WSACleanup();
exit(15);
}
//cout<<"ACCEPT CONNECTION..."<<endl;
acceptSocket = accept(myBackup, NULL, NULL);
while (acceptSocket == SOCKET_ERROR)
{
acceptSocket = accept(myBackup, NULL, NULL);
}
mySocket = acceptSocket;
}
void ServerSocket::Bind(int port)
{
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr("0.0.0.0");
myAddress.sin_port = htons(port);
//cout<<"BIND TO PORT "<<port<<endl;
if (bind (mySocket, (SOCKADDR*) &myAddress, sizeof(myAddress)) == SOCKET_ERROR)
{
cerr<<"ServerSocket: Failed to connect\n";
system("pause");
WSACleanup();
exit(14);
}
}
void ClientSocket::ConnectToServer(const char *ipAddress, int port)
{
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr(ipAddress);
myAddress.sin_port = htons(port);
//cout<<"CONNECTED"<<endl;
if (connect(mySocket, (SOCKADDR*) &myAddress, sizeof(myAddress)) == SOCKET_ERROR)
{
cerr<<"ClientSocket: Failed to connect\n";
system("pause");
WSACleanup();
exit(13);
}
}
프로그래밍 문제가 아닌 구성 문제 (예 : Windows 방화벽이 다르게 구성됨) 일 수 있습니다. –