如何通过互联网使用c ++套接字?

时间:2016-01-26 00:49:59

标签: c++ sockets networking server

所以我一直在学习c ++中的套接字编程,我可以成功创建一个在本地机器上工作的基本客户端 - 服务器套接字应用程序,但我不知道如何让它在互联网上工作,如创建一个聊天应用程序或类似的东西,我看到人们谈论UDP墙冲孔使用互联网套接字,但我似乎无法找到任何信息或教程如何做这样的事情。

服务器脚本

def moreIter(names):
    for name in names:
        yield name
        yield name + "Bar"

KEYS = ("a", "b")

src = {"a": 1, "aBar": 2, "b": 3, "bBar": 4, "c": 0, "cBar": 1, "d": 10}
d = {key: src[key] for key in moreIter(KEYS)}

客户端脚本

#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;
}

1 个答案:

答案 0 :(得分:1)

与您在本地计算机上执行此操作的方式相同。

套接字是套接字。这完全是重点。

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

不知道“UDP墙壁打孔”是什么或它在哪里。

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