{"id":15930531,"url":"https://github.com/w20089527/net","last_synced_at":"2025-04-03T14:18:52.682Z","repository":{"id":231305471,"uuid":"46898573","full_name":"w20089527/Net","owner":"w20089527","description":"A C++ Network Library","archived":false,"fork":false,"pushed_at":"2017-05-03T14:41:13.000Z","size":258,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-09T03:14:42.094Z","etag":null,"topics":["cpp","echo-server","http","http-client","http-server","socket","tcp"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/w20089527.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2015-11-26T02:06:36.000Z","updated_at":"2024-04-15T04:22:31.000Z","dependencies_parsed_at":"2024-04-03T12:32:05.386Z","dependency_job_id":"150cce39-8f57-4c7b-9506-0e8c855b4945","html_url":"https://github.com/w20089527/Net","commit_stats":null,"previous_names":["w20089527/net"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/w20089527%2FNet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/w20089527%2FNet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/w20089527%2FNet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/w20089527%2FNet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/w20089527","download_url":"https://codeload.github.com/w20089527/Net/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247014518,"owners_count":20869376,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","echo-server","http","http-client","http-server","socket","tcp"],"created_at":"2024-10-07T00:42:26.660Z","updated_at":"2025-04-03T14:18:52.656Z","avatar_url":"https://github.com/w20089527.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Net\nA C++ network library including Socket and HTTP.\n\n## Build\nTo build the project, all you need to do is to open build/Net.sln with Visual Studio 2015 and build it.\n\n## Tutorial\n### TCP Socket Example\nLet's start with a simple echo server. *(To make examples simple, we ignore all error checks.)*\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/socket/ServerSocket.h\"\n\nint main()\n{\n    net::ServerSocket server(8989);\n    auto ss = server.Accept();\n\n    char buffer[256] = { 0 };\n    int n = ss-\u003eReceive(buffer, sizeof(buffer) - 1);\n    std::cout \u003c\u003c \"Client Message: \" \u003c\u003c buffer \u003c\u003c std::endl;\n    \n    ss-\u003eSend(buffer, n);\n\n    return 0;\n}\n```\nWell, we can create a ServerSocket with the default ctor, then call **_Bind_** and **_Listen_**.\n```cpp\nnet::ServerSocket server\nserver.Bind(8989);\nserver.Listen();\n```\n\nNow let's make a simple client.\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/socket/StreamSocket.h\"\n\nint main()\n{\n    net::StreamSocket ss;\n    ss.Connect(net::SocketAddress(\"127.0.0.1\", 8989));\n\n    std::string msg = \"Hello World\";\n    ss.Send(msg.c_str(), msg.length());\n \n    char buffer[256]{ 0 };\n    ss.Receive(buffer, sizeof(buffer) - 1);\n\n    std::cout \u003c\u003c \"Echo Message: \" \u003c\u003c buffer \u003c\u003c std::endl;\n    return 0;\n}\n```\n\n### UDP Socket Example\nLike TCP Example, firstly, let's build a UDP echo server.\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/socket/DatagramSocket.h\"\n\nint main()\n{\n    net::DatagramSocket server;\n    server.Bind(net::SocketAddress(\"\", 9191));\n\n    net::SocketAddress sender;\n    char buffer[256]{ 0 };\n    int n = server.ReceiveFrom(buffer, sizeof(buffer) - 1, sender);\n    std::cout \u003c\u003c \"Received Message: \" \u003c\u003c buffer \u003c\u003c std::endl;\n\n    server.SendTo(buffer, n, sender);\n\n    return 0;\n}\n```\nHere we can build two kinds of client.\n\nOne, we use Send and Receive.\n\n*Codes are as follows:*\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/socket/DatagramSocket.h\"\n\nint main()\n{\n    net::DatagramSocket ds;\n    ds.Connect(net::SocketAddress(\"127.0.0.1\", 9191));\n\n    std::string msg = \"Hello World\";\n    ds.Send(msg.c_str(), msg.length());\n\n    char buffer[256]{ 0 };\n    ds.Receive(buffer, sizeof(buffer) - 1);\n    std::cout \u003c\u003c \"Echo Message: \" \u003c\u003c buffer \u003c\u003c std::endl;\n    return 0;\n}\n```\nThe other, we use SendTo and ReceiveFrom.\n\n*Here are the codes:*\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/socket/DatagramSocket.h\"\n\nint main()\n{\n    net::DatagramSocket ds;\n\n    std::string msg = \"Hello World\";\n    ds.SendTo(msg.c_str(), msg.length(), net::SocketAddress(\"127.0.0.1\", 9191));\n\n    char buffer[256]{ 0 };\n    net::SocketAddress sa;\n    ds.ReceiveFrom(buffer, sizeof(buffer) - 1, sa);\n    std::cout \u003c\u003c \"Echo Message: \" \u003c\u003c buffer \u003c\u003c std::endl;\n    return 0;\n}\n```\n\n### HTTP Client Example\nTo do a http request, all we need to do are as follows:\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/http/client.h\"\n\nint main()\n{\n    auto client = net::http::Client::Create();\n    auto response = client-\u003eGet(\"http://www.cppreference.com/\");\n    if (nullptr == response)\n        return 0;\n    std::cout \u003c\u003c response-\u003eGetBody() \u003c\u003c std::endl;\n\n    // We can make use of the existing client instance.\n    response = client-\u003eGet(\"http://en.cppreference.com/w/cpp/language/ascii\");\n    if (nullptr == response)\n        return 0;\n    std::cout \u003c\u003c response-\u003eGetBody() \u003c\u003c std::endl;\n    return 0;\n}\n``` \nThe Client provides **_Get_**, **_Head_**, **_Post_**, **_PostForm_** and **_Do_** methods.\nWe can choose one of them to do what we want. \n\nCurrently, we haven't supplied **~~HTTPS~~** service.\n\n### HTTP Server Example\nTo build a http server, what we can do is like follows:\n```cpp\n#include \u003ciostream\u003e\n\n#include \"net/http/handler.h\"\n#include \"net/http/server.h\"\n\nusing namespace net::http;\n\nclass SimpleHttpHandler : public Handler\n{\npublic:\n    virtual void ServeHTTP(std::shared_ptr\u003cContext\u003e ctx) override\n    {\n        std::cout \u003c\u003c \"Received Url: \" \u003c\u003c ctx-\u003eGetRequest()-\u003eGetUrl().ToString() \u003c\u003c std::endl;\n        ctx-\u003eWrite(\"Hello World\");\n    }\n};\n\nint main()\n{\n    auto server = Server::Create(8080);\n    server-\u003eSetHandler(std::make_shared\u003cSimpleHttpHandler\u003e());\n    server-\u003eListenAndServe();\n    return 0;\n}\n```\n\nCurrently, we haven't supplied **~~HTTPS~~** service.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fw20089527%2Fnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fw20089527%2Fnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fw20089527%2Fnet/lists"}