C++网络编程

19

我希望拓展自己的 C++ 知识,所以首先要学习网络编程。

我想制作一个 IRC 机器人(它有望教会我关于套接字编程和网络主题方面的知识),但我不知道从哪里开始。如果有人能向我解释 IRC 机器人的工作原理,并指导我一些学习资源,那就太好了。简单的代码片段也将非常出色......

编辑:

忘记提到我使用 ubuntu,因此 Windows 方式不可选。


阅读一本关于套接字和TCP/IP的书是我的最爱。 - user2100815
6
6年过去了,你得到了哪些好的成果?能分享一下吗? - Daniel Santos
6个回答

18
要理解套接字并正确使用它们,你必须阅读《套接字圣经》:
W. Richard Stevens, Unix网络编程,卷1:套接字API(第3版)
在着手编写套接字代码之前,你绝对需要这本书。离开家时不要忘记携带它。真的。在亚马逊上二手价从35美元起。
编辑:原帖询问其他卷册。以下是另外两本:
W. Richard Stevens, Unix网络编程,卷2:进程间通信(第2版)
W. Richard Stevens, TCP/IP详解,卷1:协议

它们都是斯蒂文斯惯常和预期的卓越品质。我不知道他整合所有这些书籍的计划是什么,


我使用Linux。那本书说Unix。这会有什么区别吗? - Lockhead
@MisterSir - 网络编程API基本相同。Stevens是一本非常好的书,适合您阅读。 - Robᵩ
其余的卷怎么样?它们是否相关? - Lockhead
@MisterSir -- 我已经添加了另外两本书。看一下,它们可能会有关联。 - Pete Wilson
@MisterSir -- 我认为你也应该考虑一下 @ildjarn 推荐的 boost.asio 库。我刚刚了解到它,但是它看起来非常不错。尽管我认为我们每个人都需要了解套接字,但从文档中看来,boost.asio 可以至少节省你几周的编码和测试时间。但是你已经使用过它并且不喜欢它:你一定知道我不知道的东西。 - Pete Wilson

11

Boost.Asio是(在我看来)用于编写现代C ++中平台无关的网络代码的事实标准。


3
您认为使用boost.asio可以避免学习套接字API吗?或者我们应该建议一个人先编写传统的套接字程序,然后再切换到boost.asio? - Robᵩ
2
@Rob Adams:虽然我认为在学习原始指针/C数组和C字符串之前应该先学习std::vector<>std::string,但我认为应该先编写boost.asio程序,然后再学习传统套接字。 - ildjarn
我使用了一些 Boost 的功能,但我真的不喜欢 boost::asio。或者可能是我没有很好地理解它。 - Lockhead
+1 在看到你的回答之前,我对boost.asio一无所知,但在研究了它之后,我认为这确实是快速启动某些东西的最佳方式。非常感谢你提供如此重要、有用的指导。 - Pete Wilson

5

我的建议:

  1. 我首先会用快速编写、功能强大的高级语言,如Python编写机器人。熟悉网络工具、IRC协议等。

  2. 学习底层套接字和网络知识。对于Unix系统,可以看看《Unix网络编程》。

  3. 用C++编写你的机器人!犯错误,修复它们,并坚持不懈。


我只懂一点点Python,如果你能给我展示一些例子,那会很有帮助。谢谢。 - Lockhead
我现在真的很忙,但是找到了这个链接给你:http://www.osix.net/modules/article/?id=780 希望能有所帮助。 - salezica

5

学习C/C++套接字编程的最佳指南一定是迄今为止最好的Beej's Guide to Network Programming。它通过示例和详细描述介绍了所有必要的步骤。据我所知,这个网站唯一缺少的信息是IPv6多播。


4

让我们从一个简单的客户端服务器示例开始,使用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网络示例。


您的程序似乎存在一些问题,其中之一是内存泄漏。 - digito_evo

0

我知道这本书有点老了,它叫做

“Beej的指南:使用Internet Socket进行网络编程”

Beej提供的所有内容都是100%免费的,以下是学习网络编程基础的网站。

https://beej.us/guide/bgnet/

我仍然推荐在这里提供的书籍,因为它们提供了关于套接字和TCP/IP协议的相当扎实的信息。

  • 《Unix网络编程:套接字联网API》- W. Richard Stevens

  • 《TCP/IP详解 卷1:协议》(第2版) - W. Richard Stevens

  • 《UNIX网络编程卷2:进程间通信》(第2版) - W. Richard Stevens

  • 《TCP/IP详解 卷1:协议》(第2版) - Kevin Fall (作者), W. Stevens (作者)

  • 《TCP/IP指南:互联网协议完全参考手册》(第1版) - Charles M. Kozierok


我不是网络程序员或软件开发人员,我的唯一兴趣是仅限于游戏开发中的网络和复制技术,特别是针对虚幻引擎。请不要私信我或询问与网络相关的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接