我是一名初学者 C++ 程序员 / 网络管理员,但只要有人指点,我就能学会如何做。大多数教程都使用旧代码进行演示,由于某些原因不再起作用。
由于我使用 Linux,所以我只需要一个关于如何编写原始 Berkeley 套接字的说明。有人可以给我快速介绍一下吗?
我是一名初学者 C++ 程序员 / 网络管理员,但只要有人指点,我就能学会如何做。大多数教程都使用旧代码进行演示,由于某些原因不再起作用。
由于我使用 Linux,所以我只需要一个关于如何编写原始 Berkeley 套接字的说明。有人可以给我快速介绍一下吗?
首先阅读Beej关于套接字编程的指南。它将带领您了解如何开始编写网络代码。之后,您应该能够通过阅读页面手册来获取更多信息。
大部分内容将包括阅读您喜欢的库的文档,以及对页面手册的基本理解。
对于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;
s = socket(AF_INET, SOCK_STREAM, 0);
connect(s, (struct sockaddr *)&sock, sizeof(sock))
对于TCP服务器端:
设置一个套接字
使用bind将您的地址绑定到该套接字上。
使用listen在该套接字上开始侦听
调用accept以获取已连接的客户端。 <--此时,您会生成一个新线程来处理连接,同时再次调用accept以获取下一个已连接的客户端。
一般通信:
使用send和recv在客户端和服务器之间进行读写。
BSD套接字源代码示例:
您可以在维基百科上找到一些很好的示例代码。
进一步阅读:
4:
一个好的起点是使用Asio,它是一个很棒的跨平台(包括Linux)网络通信库。
我过去一年一直在开发libtins。它是一个高级别的C++数据包构建和嗅探库。
除非你想要重新发明轮子并实现每个协议的内部细节,否则我建议你使用一些已经为你完成这项工作的更高级别的库。
简单:
#include <sys/socket.h>
#include <sys/types.h>
int socket(int protocolFamily, int Type, int Protocol)
// returns a socket descriptor
int bind(int socketDescriptor, struct sockaddr* localAddress, unsigned int addressLength)
// returns 0
都在sys/socket.h里面
关于这个问题有很多参考资料(当然,Stevens的书让人难以忘怀),但我觉得Beej指南对入门非常有用。它足够详细,可以让你真正理解发生了什么,但又足够简单,不会花费几天时间写一个“hello world” udp客户端/服务器。
PF_PACKET
套接字来进行捕获,这可能是SOCK_RAW
或SOCK_DGRAM
(选择取决于您正在捕获的设备)。它们都不使用例如PF_INET
或PF_INET6
SOCK_RAW
数据包;这些用于发送原始的IPv4或IPv6数据包。 - user16139739