C++ C+中的internet套接字+;
我想了解更多关于通过互联网发送数据的信息。 我到处找了很多,但都没找到帮助。。。 我正在使用MinGw,请不要说我必须更改我的开发人员程序。 到目前为止,我是根据我的发现制作的: 它非常有效,但只适用于我的本地网络。谁能告诉我,我怎样才能在互联网上做同样的事情C++ C+中的internet套接字+;,c++,sockets,client-server,data-transfer,C++,Sockets,Client Server,Data Transfer,我想了解更多关于通过互联网发送数据的信息。 我到处找了很多,但都没找到帮助。。。 我正在使用MinGw,请不要说我必须更改我的开发人员程序。 到目前为止,我是根据我的发现制作的: 它非常有效,但只适用于我的本地网络。谁能告诉我,我怎样才能在互联网上做同样的事情 using namespace std; #pragma once #include <iostream> #include "WinSock2.h" const int STRLEN = 256; class Socket
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;
}
}
}
}
使用名称空间std;
#布拉格语一次
#包括
#包括“WinSock2.h”
常数int STRLEN=256;
类套接字
{
受保护的:
WSADATA WSADATA;
套接字mySocket;
套接字备份;
插座接受插座;
我的地址中的sockaddr_;
公众:
套接字();
~Socket();
布尔发送数据(字符*);
布尔记录数据(字符*,整数);
void CloseConnection();
void GetAndSendMessage();
};
类ServerSocket:公共套接字
{
公众:
虚心倾听();
无效绑定(int端口);
无效启动(内部端口);
};
类ClientSocket:公共套接字
{
公众:
无效ConnectToServer(常量字符*ipAddress,int端口);
};
套接字::套接字()
{
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=无错误)
{
cerr您不了解的是什么?我看到了代码,它绑定到本地套接字,然后您通过客户端连接到它。您也可以通过internet进行此操作,但您对该过程不了解的是什么?恐怕您可能需要在尝试编写套接字代码之前开始学习TCP/IP的基础知识。它是如果你想在互联网上使用套接字,并且希望你的应用程序在所有网络设置上都可用,包括NAT,那么你必须使用一种称为TCP Holepunch的技术(或者UDP Holepunch也适用)。我认为你的方法行不通
因为端点之间存在一些NAT,所以套接字连接失败
我建议对NAT进行调查
和承载从Internet可见的服务的能力很大程度上取决于您的Internet连接类型。如果您使用NAT,则需要设置NAT端口转发。如果您的IP地址是动态的,则需要知道您的公共可用IP地址(请尝试).你能发布文件中的内容吗?我不会从互联网上下载随机文件。我如何将源代码放入代码栏?请在问题中提供代码。请详细说明你遇到的困难。你是否在使用NAT(可能在路由器中)。编辑问题,粘贴源代码,突出显示,然后按code
按钮(或CTRL-K)。我冒昧地更新了他的帖子,将该站点的代码包括在内……那么你能修改代码吗,或者至少告诉我从哪里“开始学习TCP/IP的基础知识”吗这并不是说我不能理解你的论点,但我不相信这将有助于OP。但感谢你发布source@user1496857你应该阅读我答案中链接中的文档。如果你遇到了你还不知道的概念,你将有很好的起点learning@user1496857-我认为,根据我的经验,如果如果你想学习TCP/IP的基础知识,你需要一本教科书。你不能仅仅通过修补来学习。是的,学习涉及修补,但这两个方面是不一样的。我同意,如果你真的想知道自己在做什么,你真的需要一本关于TCP/IP的书。你可能可以通过修补来修补一些东西,但你不知道是什么at正在进行,如果您不知道自己在做什么,就不应该编写套接字代码。Holepunching很棘手。我说-只需在NAT中显式打开端口。也就是说,一旦OP知道它是NAT。而且由于他没有提供关于不同端点的信息,这可能还不够。您是对的,这很棘手。即使使用关于TCP/IPI的一些知识希望该程序能在几乎每台pc上运行,即使它们有端口转发功能,即使它们没有。@user1496857这是一个值得称赞的目标,但很明显,你不具备这方面的知识。请不要把这当作个人问题,我们都有过类似的经历。问题是,你知道的太多了壁架-不止一个,因此答案可以合理匹配。