当前位置:  开发笔记 > 编程语言 > 正文

如何在C++中创建RAW TCP/IP数据包?

如何解决《如何在C++中创建RAWTCP/IP数据包?》经验,为你挑选了4个好方法。

我是C++程序员/网络管理员的开始,但我想如果有人指出我正确的方向,我可以学习如何做到这一点.大多数教程都使用旧代码进行演示,这些代码由于某种原因不再有效.

因为我在Linux上,所以我需要的是如何编写原始Berkeley套接字的解释.有人可以给我一个快速的运行吗?



1> X-Istence..:

首先阅读Beej关于套接字编程的指南.它将使您快速了解如何开始编写网络代码.之后,您应该能够从阅读手册页中获取越来越多的信息.

其中大部分内容包括阅读您喜欢的图书馆的文档,以及对手册页的基本了解.



2> 小智..:

对于初学者来说,如果你用"原始"来澄清你的意思,那将会很有帮助.传统上,这意味着您希望自己制作所有第4层标头(TCP/UDP/ICMP ...标头),或者某些IP标头.为此你需要的不仅仅是beej的教程,我已经在这里提到了很多.在这种情况下,您需要在调用套接字时使用SOCK_RAW参数获取的原始IP套接字(有关基础知识,请参阅http://mixter.void.ru/rawip.html).

如果您真正想要的只是能够建立到某个远程主机(如stackoverflow.com上的端口80)的TCP连接,那么您可能不需要"原始"套接字,而beej的指南将很好地为您服务.

有关该主题的权威参考,您应该选择Stevens等人的Unix网络编程,第1卷:套接字网络API(第3版).



3> Brian R. Bon..:

对于TCP客户端:

使用gethostbyname将dns名称查找为IP,它将返回一个hostent结构.我们称这个返回值为主机.

hostent *host = gethostbyname(HOSTNAME_CSTR);

填充套接字地址结构:

sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(REMOTE_PORT);
sock.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;

创建一个套接字并调用connect:

s = socket(AF_INET, SOCK_STREAM, 0); 
connect(s, (struct sockaddr *)&sock, sizeof(sock))

对于TCP服务器端:

设置套接字

使用bind将您的地址绑定到该套接字.

通过listen开始监听该套接字

致电接受以获得连接的客户端.< - 此时,当您再次调用accept以获取下一个连接的客户端时,您会生成一个新线程来处理连接.

一般沟通:

使用send和recv在客户端和服务器之间进行读写.

BSD套接字的源代码示例:

您可以在维基百科上找到一些很好的示例代码.

进一步阅读:

我强烈推荐这本书和这个在线教程:

替代文字

4:


gethostbyname不应再用于新项目:它与IP版本(IPv4)相关联.现在剩余的IPv4地址库存正在[快速耗尽](http://www.potaroo.net/tools/ipv4/index.html),你真的应该使用与版本无关的getaddrinfo(适用于v4和v6) .

4> Tom Leys..:

一个好的起点是使用Asio,这是一个很棒的跨平台(包括Linux)网络通信库.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有