Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c++;互联网上的插座? 我一直在学习C++中的Socket编程,我可以成功地创建一个在本地机器上工作的基本客户机-服务器套接字应用程序,但是我不知道如何让它在因特网上工作,比如创建聊天应用程序或类似的东西,我看到人们在谈论使用互联网插座的UDP穿墙,但我似乎找不到任何关于如何使用互联网插座的信息或教程_C++_Sockets_Networking_Server - Fatal编程技术网

如何使用c++;互联网上的插座? 我一直在学习C++中的Socket编程,我可以成功地创建一个在本地机器上工作的基本客户机-服务器套接字应用程序,但是我不知道如何让它在因特网上工作,比如创建聊天应用程序或类似的东西,我看到人们在谈论使用互联网插座的UDP穿墙,但我似乎找不到任何关于如何使用互联网插座的信息或教程

如何使用c++;互联网上的插座? 我一直在学习C++中的Socket编程,我可以成功地创建一个在本地机器上工作的基本客户机-服务器套接字应用程序,但是我不知道如何让它在因特网上工作,比如创建聊天应用程序或类似的东西,我看到人们在谈论使用互联网插座的UDP穿墙,但我似乎找不到任何关于如何使用互联网插座的信息或教程,c++,sockets,networking,server,C++,Sockets,Networking,Server,服务器脚本 #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <string> #pragma comment(lib, "Ws2_32.lib") using namespace std; int main(){ cout << ">>>WINSOCK SEREVER\n"; WSADATA wsa

服务器脚本

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>

#pragma comment(lib, "Ws2_32.lib")

using namespace std;

int main(){
    cout << ">>>WINSOCK SEREVER\n";

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    addrinfo hints;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;


    addrinfo *Results = NULL;
    if (!getaddrinfo("41.143.215.7", "255", &hints, &Results)){
        cout << "->Ready To Create SOCKET and bind Address\n";
        SOCKET listenSocket = INVALID_SOCKET;
        listenSocket = socket(Results->ai_family, Results->ai_socktype, Results->ai_protocol);
        if (listenSocket != INVALID_SOCKET){
            cout << "->Socket is created...";
            if (bind(listenSocket, Results->ai_addr, Results->ai_addrlen) != SOCKET_ERROR){
                cout << "and bind successfuly\n [" << getsockname(listenSocket, Results->ai_addr, (int *)Results->ai_addrlen) << "]\n";
                if (!listen(listenSocket, SOMAXCONN)){
                    cout << "->waiting for Client to connect";
                    SOCKET clientSocket = INVALID_SOCKET;
                    clientSocket = accept(listenSocket, NULL, NULL);
                    if (clientSocket != INVALID_SOCKET){
                        cout << "->Client Has Connected\nWaiting for Messages...";
                        int iResult = 1;
                        while(true){
                            char BufferRcv[9000];
                            iResult = recv(clientSocket, BufferRcv, 9000, 0);
                            if (iResult > 0){
                                cout << "\nBuffer Received : \n" << BufferRcv;
                            }   
                        }
                    }

                }
            }
            else { cout << "Error Binding Socket!!!"; }

        }

    }



    cin.get();
    return 0;
}
#包括
#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
使用名称空间std;
int main(){
cout ai_family,Results->ai_socktype,Results->ai_协议);
if(listenSocket!=无效的\u套接字){
cout ai_addr,Results->ai_addrlen)!=套接字错误){
cout ai_addrlen)0){
cout ai_family,Results->ai_socktype,Results->ai_协议);
if(connectSocket!=无效的_SOCKET){
cout ai_addr,Results->ai_addrlen)!=套接字错误){

不能像在本地机器上那样做

插座就是插座,这才是重点

只需确保家庭网络的配置方式使通信量可以在两台机器之间通过;通常家庭网络采用NAT,在这种情况下,您需要通过路由器转发端口

不知道“UDP穿墙”是什么,也不知道它是从哪里来的


任何进一步的信息都需要您的网络示意图和您的预期用途的详细计划。

您需要提供更多详细信息,您的服务器(您是否有)与internet相关,客户机在哪里?你有NAT、防火墙、代理等吗?我没有服务器,我只想知道如何使我的程序能够通过internet将套接字发送到另一台有服务器程序但不在同一网络上的机器。目前,我的聊天应用程序可以工作,但如果我将服务器ip从127.0.0.1更改为另一个internet协议,它将不会工作另一台机器是在互联网上还是在其他人的网络中(即他们的房子或工作)。如果它位于internet上,则您可能可以打开与它的TCP连接,但请注意,如果您位于公司网络内,则可能会被阻止。如果目标位于其他人的网络中,则您需要设置端口转发。或者将应用程序写为会合类型的应用程序“通过internet发送套接字”是没有意义的。127.0.0.1不是这不是一个互联网协议。不清楚你在问什么,而且内容太广泛。你真的需要提供更多的细节。这两台机器在哪里,你在使用什么地址,你出现了什么错误等等。如果我在本地机器上做同样的事情,那就不起作用。如果我试图将套接字绑定到另一个不同于127.0.0.1的IP,我会出错。这是不公平的说法这是一样的,事实并非如此。99%的时间在互联网上从机器a到机器b的通话不仅仅是打开tcp管道的情况。几乎可以肯定的是,一个或多个玩家并不是直接的addrressable@TahaElkhaoua只需将其绑定到0.0.0.0,这是一个特殊地址,表示“此计算机上的任何地址”(在绑定的情况下)@pm100:但实际的程序代码将是相同的。除非他必须将其更改为使用会合服务器解决方案。如果他无法让a与b对话,则他必须实现a与x对话,b与x对话
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>

#pragma comment(lib, "Ws2_32.lib")

using namespace std;

int main(){
    cout << ">>>WINSOCK CLIENT\n";
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    addrinfo hints;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    addrinfo *Results = NULL;

    if (!getaddrinfo("41.143.215.79", "255", &hints, &Results)){
        cout << "->Ready To Create SOCKET and connect to SERVER\n";
        SOCKET connectSocket = INVALID_SOCKET;
        connectSocket = socket(Results->ai_family, Results->ai_socktype, Results->ai_protocol);
        if (connectSocket != INVALID_SOCKET){
            cout << "->Created Socket Successfuly...connecting to server\n";
            if (connect(connectSocket, Results->ai_addr, Results->ai_addrlen) != SOCKET_ERROR){
                cout << "->Connected To Server Successfuly\n";
                string Message;
                while (true){
                    cout << "\n->Enter A Message :";
                    getline(cin, Message);          
                    if (send(connectSocket, Message.c_str(), sizeof(Message), 0) != SOCKET_ERROR){
                        cout << "MESSAGE IS SENT\n";
                    }
                }
            }
        }
    }



    cin.get();
    return 0;
}