Linux网络编程学习笔记

抽时间学习了Linux的网络编程,以前只是对socket有个字面上的了解,具体的机制和用法一无所知。正好项目要用,学习下,做个笔记。

Linux上,任何都可以当做文件来对待。获得一个文件描述符,就可以对它进行读写操作。socket也是一样。

socket在Linux下被翻译成套接字,我觉得这个翻译真的很烂,第一次接触的人不可能知道套接字是个什么东西。翻译成插座反而直观明了,更容易理解。

socket是为c/s模型设计的,也就是客户--服务器模型。解决了进程间通信的问题。

下面主要说的面向连接的socket,无连接的socket就不讲了。

简单的将,服务端起一个socket,监听一个端口,等待客户端的连接,然后客户端起一个socket,指向服务端的ip地址,端口号,向服务器发起连接请求。连接成功后就可以发送信息。看一下简单的流程

Linux网络编程学习笔记

前面讲了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就是服务器地址。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/7581ca296ab9c1ee760337b95bbc8533.html