2012-05-31 2 views
0

이 코드는 네트워크에서 잘 작동하지만 친구 네트워크에서는 잘 작동합니다. 클라이언트가 내 친구의 호스트에 연결할 수 없습니다. 내 네트워크의 기본 게이트웨이는 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); 
    } 
} 
+1

프로그래밍 문제가 아닌 구성 문제 (예 : Windows 방화벽이 다르게 구성됨) 일 수 있습니다. –

답변

2

대부분의 현대 무선 액세스 포인트는 볼 무선 호스트를 방지하는 "무선 격리"기능을 제공합니다 네트워크상의 다른 호스트 (핫스팟 자체는 제외). 이것은 주로 기본적으로 사용되는 보안 기능입니다. 내가 알 수있는 한 이것이 당신의 문제에 대한 가장 많은 이유 일 것입니다. 무선 AP 설정을 확인하고 격리를 비활성화하십시오.

+0

감사합니다. 그 설정을 변경하는 방법에 대한 조언이 있습니까? 내 친구의 라우터는 링크시스 라우터입니다. – Iowa15

+0

@ Iowa15 : [웹 설정 페이지] (http://192.168.1.1/)로 가서 고급 무선 설정에서 액세스 포인트 격리를 찾으십시오. – arx

+0

감사합니다. 나는 그것을 시도 할 것이다. – Iowa15

관련 문제