인터넷을 통해 데이터를 보내는 것에 대해 더 알고 싶습니다. 나는 어디에서나 많이 찾았지만 아무것도 도움이되지 못했습니다 ... 저는 MinGw를 사용하고 있습니다. 개발자 프로그램을 변경해야한다고 말하지 마십시오. 지금까지 내가 발견 한 것으로부터 이것을 만들었습니다 : 그리고 그것은 내 로컬 네트워크에만 유용합니다. 아무도 내가 인터넷을 통해서만 똑같은 일을 할 수있는 방법을 말해 줄 수 있습니까? 반응하지만, 난 그냥 그래서 난 인터넷을 사용할 수 변경해야합니다 코드의 어떤 부분 물었을 때 당신이 읽고 나에게 많은 것을 준 모든 사람에게C++ 인터넷 소켓
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;
}
}
}
}
감사합니다. 분명히 나는 거기에 쓰여진 것의 절반을 이해할 수 없다. 아직도 아무것도 도움이되지 않았습니다.
해당 파일의 내용을 게시 할 수 있습니까? 인터넷에서 임의의 파일을 다운로드하지 않습니다. – Blender
코드 막대에 소스를 넣을 수 있습니까? – user1496857
질문에 코드를 입력하십시오. 경험하는 어려움에 대해 더 자세히 기술하십시오. NAT를 사용하고 있습니까 (아마도 라우터에서). –