抽时间学习了Linux的网络编程,以前只是对socket有个字面上的了解,具体的机制和用法一无所知。正好项目要用,学习下,做个笔记。
在Linux上,任何都可以当做文件来对待。获得一个文件描述符,就可以对它进行读写操作。socket也是一样。
socket在Linux下被翻译成套接字,我觉得这个翻译真的很烂,第一次接触的人不可能知道套接字是个什么东西。翻译成插座反而直观明了,更容易理解。
socket是为c/s模型设计的,也就是客户--服务器模型。解决了进程间通信的问题。
下面主要说的面向连接的socket,无连接的socket就不讲了。
简单的将,服务端起一个socket,监听一个端口,等待客户端的连接,然后客户端起一个socket,指向服务端的ip地址,端口号,向服务器发起连接请求。连接成功后就可以发送信息。看一下简单的流程
前面讲了socket可以当做一个文件来读写。那么读写文件一般都是要获得一个文件描述符,socket通信要获得一个socket描述符,也可以理解为特殊的文件描述符,叫法不同而已。
通过socket函数获得socket描述符
int socket(int domain , int type , int protocol);
这个函数返回一个int型的值,就是socket描述符。如果发生错误则返回-1。
domain确定通信域,包括地址格式。通常被设为AF_INET代表IPv4因特网。
type确定socket类型,是无连接还是有链接的。
protocol通常设为0,表示按给定的域和socket类型选择默认协议。比如domain为AF_INET,type为SCOK_STREAM时,默认协议就是TCP。
bind()函数绑定端口。 【Linux公社 】 声明如下
int bind (int sockfd , const struct sockaddr *my_addr , int addrlen) ;
其中,sockfd就是socket函数返回的socket描述符;my_addr是一个指向struck sockaddr的指针,包含地址信息:名称、端口和ip地址。
addrlen一般设为sizeof(struct sockaddr);
connect()函数连接服务器地址,声明如下:
int connect (int sockfd, const struct sockaddr *serv_addr, int addrlen);
返回一个int型的值,连接成功返回0,出错则返回-1;
参数sockfd还是socket描述符,此时是请求连接的socket。
serv_addr就是服务器地址。