我是C++程序员/网络管理员的开始,但我想如果有人指出我正确的方向,我可以学习如何做到这一点.大多数教程都使用旧代码进行演示,这些代码由于某种原因不再有效.
因为我在Linux上,所以我需要的是如何编写原始Berkeley套接字的解释.有人可以给我一个快速的运行吗?
首先阅读Beej关于套接字编程的指南.它将使您快速了解如何开始编写网络代码.之后,您应该能够从阅读手册页中获取越来越多的信息.
其中大部分内容包括阅读您喜欢的图书馆的文档,以及对手册页的基本了解.
对于初学者来说,如果你用"原始"来澄清你的意思,那将会很有帮助.传统上,这意味着您希望自己制作所有第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版).
对于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:
一个好的起点是使用Asio,这是一个很棒的跨平台(包括Linux)网络通信库.