基本TCP套接字总结

网络编程之前也写过一些小程序,但是都是照猫画虎.按照书中实例,一个一个照抄的.虽然程序都有本身的结构,照抄运行没有问题.但是总觉得是门外汉.喜欢金庸的人,我想不止看电视剧那么肤浅,都会看看原著小说.同样,所有的网络编程都用socket,只是框架把原始函数包裹的不一样。框架只是为了使用方便和代码复用,但要真正对网络编程理解深刻,原始函数的作用也每个步骤的细节还是要自己多多琢磨。

TCP/IP的基本结构和OSI 网络的7层模型是每个网络编程者必须具备的基本知识,这样随着套接字每个函数细节的展开,体会才更加深刻。Socket本身的历史,和其实现时,ANSI C 还没有成为标准。就后续IP地址,V4和V6的原因,也有很多函数兼容问题。

intsocket(int  family,  int  type,  int protocol);

网络编程,离不开客户端和服务器。第一个函数都会是socket.但是在服务器和客户端此函数的后续需要不同的处理。Socket默认申请的套接字为主动套接字。

就是客户端会用connect函数调用的套接字。而服务器会调用listen,把这个主动套接字改为被动套接字,让其接收外来连接。

    Bind函数,绑定IP地址和端口号。客户端可以不用调用bind。因为在connect

时,客户端内核会为其自动绑定本机IP和临时端口。其实服务器也可以由内核分配,虽然程序可以运行。由于服务器每次分配的临时端口号都不一样,这样客户端就无法连接。

     客户端(ip,port),服务器(ip,port),其中服务器port和客户端port是不一样的。只要客户端知道在自己的端口(比如2323)要和服务器的端口(比如5151)通信就行,服务器也是如此。

     服务器:socket bind listen  accept

     客户端:socket bind(可以省略) connect

 在这几个函数调用后,套接字一直在变化状态。比如服务器,listen后,套接字是监听套接字。可以接受外来连接请求。而accept成功后,会返回一个连接套接字。服务器中就存在两种套接字。客户端connect时,只要知道服务器的地址和端口,可以不用提供本机IP和端口绑定代码,有客户端内核提供。将来服务器可以通过getsockname获取客户连接信息。

标签