c++ - Winsock C++ 应用程序无法在某些网络上运行

标签 c++ winapi network-programming winsock

此代码在我的网络上运行良好,但在我 friend 的网络上运行良好。客户端无法连接到我 friend 的主机。我网络上的默认网关是 10.0.1.1,子网掩码是 255.255.255.0。我 friend 的默认网关是192.168.1.1,子网掩码也是一样的。顺便说一下,这些是无线网络连接上无线 LAN 适配器的 IP。在我 friend 的网络上,客户端套接字和服务器套接字初始化都很好,但它们没有相互连接。如果您在同一台计算机上运行主机和客户端,它们将连接,但不会在不同的计算机上。一个我的网络,两台电脑都运行windows 7,在他的,一台运行win7,一台运行win Vista

//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);
    } 
}

最佳答案

大多数现代无线接入点都提供“无线隔离”功能,可防止无线主机看到网络上的另一台主机(热点本身除外)。这是一项主要默认启用的安全功能。据我所知,这是您遇到问题的最可能原因。只需检查您的无线 AP 设置并禁用隔离。

关于c++ - Winsock C++ 应用程序无法在某些网络上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10838028/

相关文章:

swift - GCDASyncScocket readDataToLength : with swift

c# - 是否可以使用 WCF 发现来公开使用命名管道的 WCF 端点?

c++ - 如何将数字添加到字符串?

c++ - C++中NV12到RGB24的转换代码

linux - 来自 TCP 套接字的 HTTP 服务器(在 Go 中)

c++ - 在 c++ 中寻找 win7 64 位任务栏上的 DeskBand 工具栏示例

c++ - SetWinEventHook 不捕获任何事件

c++ - 将 GDAL 合并到 MSVS 2008 C++ 项目中

c++ - 从 a_func(A a_in) 转换为 b_func(B b_in) 的函数 (c++)

c++ - 如何在 C++ 中删除动态分配的指向 int 指针的指针?