C++网络编程

Posted

技术标签:

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

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

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

谢谢!

编辑:

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

【问题讨论】:

阅读一本关于套接字和 TCP/IP 的书会是我的最爱。 6 年后,什么对你有用?可以分享一下吗? 【参考方案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】:

我的建议:

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

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

    用 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

【讨论】:

以上是关于C++网络编程的主要内容,如果未能解决你的问题,请参考以下文章

C++编程考级喜报

怎样学好C++编程语言

c++编程用啥软件好

C++网络编程

c++ 求解 编程高手

现代C++函数式编程