【问题标题】:C++ network programmingC++网络编程
【发布时间】:2011-08-12 00:24:57
【问题描述】:

嘿,我想扩展我在 C++ 方面的知识,所以我要做的第一件事就是网络编程。

我想制作一个 IRC 机器人(希望它能教我有关套接字编程和网络主题的知识),但我不知道从哪里开始。如果有人能向我解释 IRC 机器人是如何工作的以及如何制作它们,并指导我使用一些学习资源,那就太好了。简单的 sn-ps 也会很棒......

谢谢!

编辑:

忘了说我用的是ubuntu,所以windows方式不行

【问题讨论】:

  • 阅读一本关于套接字和 TCP/IP 的书会是我的最爱。
  • 6 年后,什么对你有用?可以分享一下吗?

标签: c++ sockets network-programming irc bots


【解决方案1】:

要了解套接字并正确使用它们,您需要套接字圣经:

W。理查德·史蒂文斯,Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition)

在您坐下来编写一行套接字代码之前,您绝对必须拥有这本书。没有它就不要离开家。真的。在Amazon 使用约 35 美元起。

编辑: OP 询问了其他卷。以下是另外两个:

 W. Richard Stevens, UNIX Network Programming, Volume 2: Interprocess Communications (2nd Edition)
W.理查德史蒂文斯, TCP/IP Illustrated, Vol. 1: The Protocols

它们具有 Stevens 一贯和预期的卓越品质。我不知道他整合所有这些书籍的计划是什么,

【讨论】:

  • 我使用 linux.. 那本书说 Unix。这会有什么不同吗?
  • @MisterSir - 网络 API 几乎相同。史蒂文斯对你来说是一本很棒的书。
  • 其余的卷呢?它们是否相关?
  • @MisterSir -- 我添加了另外两本书。看一看;它们可能是相关的。
  • @MisterSir -- 我认为您还应该考虑@ildjarn 推荐的 boost.asio 库。我只是刚刚了解它,但它对我来说看起来非常好。尽管我认为我们每个人都需要了解套接字,但从文档看来 boost.asio 可以为您节省至少几周的编码和测试时间。但是你用过它却不喜欢它:你一定知道一些我不知道的东西。
【解决方案2】:

boost.asio 是(在我看来)用现代 C++ 编写独立于平台的网络代码的事实标准。

【讨论】:

  • 您认为使用 boost.asio 可以避免学习套接字 API 的需要吗?还是建议大家先写传统的socket程序,再改用boost.asio?
  • @Rob Adams : 就像我认为在原始指针/C 数组和 C 字符串之前应该学习 std::vector<>std::string 一样,我认为应该先编写 boost.asio 程序然后之后学习传统的套接字。
  • 我使用了一些 boost 的特性,但我真的不喜欢 boost::asio。或者也许我只是不太了解它。
  • +1 在看到您的答案之前,我对 boost.asio 一无所知,但看了之后,我认为这确实是让某些东西快速运行的最佳方式。感谢您提供的非常重要且有用的指针。
【解决方案3】:

我的建议:

  1. 我首先会用编写速度快、功能强大的高级语言(例如 python)来编写机器人。习惯使用网络工具、IRC 协议等。

  2. 了解底层的套接字和网络。对于 Unix,我想说看看 Unix Network Programming。

  3. 用 C++ 编写您的机器人!犯错误,改正错误,然后坚持下去。

【讨论】:

  • 我真的只懂一点 Python,所以如果你能给我看一些例子,那可能会有所帮助。谢谢
  • 我现在时间真的很紧,但找到你这个:osix.net/modules/article/?id=780希望它有帮助
【解决方案4】:

到目前为止,学习 C/C++ 套接字编程的最佳指南一定是Beej's Guide to Network Programming。它通过示例和详细说明完成了您需要了解的所有步骤。据我所知,该网站唯一缺少的信息是 IPv6 多播。

【讨论】:

    【解决方案5】:

    从一个简单的客户端-服务器示例开始。使用 Qt 框架非常容易。例如:

    server.cpp:

    #include <QTcpSocket>
    #include <QTcpServer>
    
    int main()
    {
        QTcpServer *tcpServer = new QTcpServer(); //creates TCP-based server
        tcpServer->listen(QHostAddress("172.16.254.1"),5300); //listen on your IP adress, port 5300
        while ( tcpServer->isListening() )  //while server is listening
        {   
            QTcpSocket* tcpSocket; //define TCP-based socket
            tcpServer->waitForNewConnection(); //server waits for connection
            if ( (tcpSocket = tcpServer->nextPendingConnection()) ) //if there are connections to be processsed 
            { 
                    tcpSocket->write("hello",6); //write "hello" to the socket, client is connected to
                    tcpSocket->flush();    
            }
        }
    }
    

    client.cpp:

    #include <QDebug>
    #include <QTcpSocket>
    
    int main()
    {
        QTcpSocket *tcpSocket = new QTcpSocket(); //create TCP-based socket
        tcpSocket->connectToHost("172.16.254.1",5300); //connect socket to server
        tcpSocket->waitForConnected(); //wait 
        tcpSocket->waitForReadyRead(); 
        qDebug() << tcpSocket->readAll();    
    }
    

    您需要做的就是在一个终端窗口中运行第一个程序,然后在另一个窗口中运行第二个程序。

    你会发现更多Qt网络示例here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2021-08-23
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多