C++ Winsock C++;应用程序在某些网络上不工作
此代码在我的网络上运行良好,但在我朋友的网络上运行良好。客户端无法连接到我朋友的主机。我的网络上的默认网关是10.0.1.1,子网掩码是255.255.255.0。在我朋友的服务器上,默认网关是192.168.1.1,子网掩码是相同的。顺便说一下,这些是无线网络连接上无线LAN适配器的IP。在我朋友的网络上,客户端套接字和服务器套接字都可以正常初始化,但它们彼此不连接。如果在同一台计算机上运行主机和客户端,它们将连接,但不会在不同的计算机上连接。一台是我的网络,两台电脑都运行Windows7,一台是win7,另一台是WinVistaC++ Winsock C++;应用程序在某些网络上不工作,c++,winapi,network-programming,winsock,C++,Winapi,Network Programming,Winsock,此代码在我的网络上运行良好,但在我朋友的网络上运行良好。客户端无法连接到我朋友的主机。我的网络上的默认网关是10.0.1.1,子网掩码是255.255.255.0。在我朋友的服务器上,默认网关是192.168.1.1,子网掩码是相同的。顺便说一下,这些是无线网络连接上无线LAN适配器的IP。在我朋友的网络上,客户端套接字和服务器套接字都可以正常初始化,但它们彼此不连接。如果在同一台计算机上运行主机和客户端,它们将连接,但不会在不同的计算机上连接。一台是我的网络,两台电脑都运行Windows7,一
//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);
}
}
//Socket.h
#布拉格语一次
#包括
#包括“WinSock2.h”
使用名称空间std;
常数int STRLEN=256;
类套接字
{
受保护的:
WSADATA WSADATA;
套接字mySocket;
套接字备份;
插座接受插座;
我的地址中的sockaddr_;
公众:
套接字();
~Socket();
布尔发送数据(字符*);
布尔记录数据(字符*,整数);
void CloseConnection();
void GetAndSendMessage();
};
类ServerSocket:公共套接字
{
公众:
虚心倾听();
无效绑定(int端口);
无效启动(内部端口);
};
类ClientSocket:公共套接字
{
公众:
无效ConnectToServer(常量字符*ipAddress,int端口);
};
//Socket.cpp
#包括“Socket.h”
套接字::套接字()
{
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=无错误)
{
cerr大多数现代无线接入点提供“无线隔离”功能,防止无线主机看到网络上的另一台主机(热点本身除外)。这是一项默认启用的安全功能。据我所知,这是您出现问题的最可能原因。只需检查您的无线AP设置并禁用隔离。我觉得这很可能是配置问题(例如,Windows防火墙的配置不同)这不是一个编程问题。谢谢。你对如何更改设置有什么建议吗?我朋友家的路由器是linksysrouter@Iowa15:转到,并在高级无线设置下查找接入点隔离。