gpt4 book ai didi

c++ - C++中的互联网套接字

转载 作者:行者123 更新时间:2023-11-30 04:26:48 25 4
gpt4 key购买 nike

我想了解有关通过 Internet 发送数据的更多信息。我一直在到处搜索,但没有任何帮助......我正在使用 MinGw,请不要说我必须更改我的开发人员程序。到目前为止,我是根据我发现的内容制作的: 它工作得很好,但只适用于我的本地网络。谁能告诉我如何仅通过互联网做同样的事情?

using namespace std;
#pragma once
#include <iostream>
#include "WinSock2.h"
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::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();//without this, it gets the return char from the last cin and ignores the following one!
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);
}
}

int main()
{
int choice;
int port = 666;
//char *ipAddress = "127.0.0.1";
string ipAddress;
bool done = false;
char recMessage[STRLEN];
char sendMessage[STRLEN];
cout<<"1) Host server"<<endl;
cout<<"2) Join server"<<endl;
cout<<"3) Quit"<<endl;
cin>>choice;
if ( choice == 3 )
exit(0);
else if ( choice == 2 )
{
//Client
cout<<"Enter an IP address, 127.0.0.1 is the loopback address"<<endl;
cin>>ipAddress;
ClientSocket sockClient;
cout<<"ATTEMPTING TO CONNECT..."<<endl;
sockClient.ConnectToServer( ipAddress.c_str(), port );
//Connected
while ( !done )
{
sockClient.GetAndSendMessage();
cout<<"\t--WAIT--"<<endl;
sockClient.RecvData( recMessage, STRLEN );
cout<<"Recv > "<<recMessage<<endl;
if ( strcmp( recMessage, "end" ) == 0 ||
strcmp( sendMessage, "end" ) == 0 )
{
done = true;
}
}
sockClient.CloseConnection();
}
else if ( choice == 1 )
{
//SERVER
ServerSocket sockServer;
cout<<"HOSTING..."<<endl;
sockServer.StartHosting( port );
//sockServer.StartHosting( port );
//Connected
while ( !done )
{
cout<<"\t--WAIT--"<<endl;
sockServer.RecvData( recMessage, STRLEN );
cout<<"Recv > "<<recMessage<<endl;
sockServer.GetAndSendMessage();
if ( strcmp( recMessage, "end" ) == 0 || strcmp( sendMessage, "end" ) == 0 )
{
done = true;
}
}
}
}

感谢所有回复的人,但是,当我刚刚询问应该更改代码的哪一部分以便我可以使用互联网时,你们给了我很多阅读的机会。显然我不能理解那里写的一半内容。仍然没有任何帮助。

最佳答案

如果你想在互联网上使用套接字,并且你希望你的应用程序在每个网络设置上都可用,包括 NAT,你将不得不使用称为技术的 TCP 打洞(或者 UDP 打洞也可能适合)。我认为你的方法不起作用因为在您的端点之间存在一些 NAT,所以套接字连接失败。

我建议调查 NAT。 Peer-to-Peer Communication Across Network Address Translators

this discussion here on SO

关于c++ - C++中的互联网套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11299530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com