初学Socket通信

  1.Socket:Socket就是套接字。客户端与服务器之间通信用的。Socket接口是TCP/IP网络的API.

  

  2.SYN是TCP/IP建立连接时使用的握手信号。在客户端和服务器之间建立正常的TCP网络连接时,客户端首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到这个消息,最后客户端再以ACK消息响应。这样在客户端和服务器之间才能建立起可靠的TCP连接,数据才可以在客户端和服务器之间传递。

  

  3.ACK即确认字符,在数据通信中,接收站给发送站的一种传输类控制字符。表示发来的数据已确认接受无误。

  4.网络中进程之间的通信,首要解决的是如何标识一个进程,否则无从谈起!TCP/IP协议帮我们解决了这个问题,网络层的ip地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址、协议、端口)就可以标识网络的进程了,进程通信就利用这个标志与其他进程进行交互。TCP/IP采用编程接口是socket(套接字)。

 

  5.socket的基本操作:“open-write/read-close”模式

   流程:①socket()

      ②bind()

      ③listen()、connect()

      ④accept()

      ⑤read()、write()

      ⑥close()

    

  6.socket()函数

   int socket(int domain,int type,int protocol);

   socket()用于创建一个socket描述符,传入不同参数,创建不同的socket描述符。

   参数:

   domain:协议域,决定了socket的地址类型;

   type:指定socket类型;

   protocol:协议(如TCP、UDP、STCP、TIPC)

   socket()创建一个socket时,返回的socket描述子存在于协议域空间中,但是没有一个具体的地址。如果想要给它赋值一个地址,必须调用bind()函数,否则当调用connect()、listen()时系统会自动随机分配一个端口。

    

  7.bind()函数

   int bind(int sockfd,const struct sockaddr *addr,socklen_t  adddrlen);

   参数:

   sockfd:bind()就是将给这个描述字绑定一个名字;

   addr:一个const struct sockaddr*指针,指向要绑定给sockfd的协议地址。这个地址结构根据创建socket时的地址协议族的不同而不同。

 

  8.listen()、connect()函数

   服务器在调用socket()、bind()之后就会调用listen()来监听这个socket,客户端调用connect()发出连接请求,服务端就会接收这个请求

   int listen(int sockfd,int backlog);

   int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

   参数:

   listen函数的第一个参数是要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是主动类型的,listen()将socket变为被动类型的,等待客户的连接请求。

   connect函数的第一个参数即为客户端的socket描述字,第二个参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

 

  9.accept()函数

   TCP服务端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求后,就会调用accept()函数接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了。

   int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

   accept函数的第一个参数为服务器的socket描述字,第二个为指向struct sockaddr*的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accept成功,那么返回值是有内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

   注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,成为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器同城仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个有服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

 

  10.read()、write()等函数

   服务器与客户建立好连接,就可以调用网络I/O进行读写操作了,实现网络中不同进程之间的通信!

   ①read()/write()

   ②recv()/send()

   ③readv()/writev()

   ④recvmsg()/sendmsg()

   ⑤recvfrom()/sendto()

   read函数是负责从fd读取内容,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为eintr说明读是由中断引起的,如果是econnrest表示网络连接出了问题。

   write函数将buf中的字节内容写入文件描述符fd.成功时返回写的字节数。失败时返回-1,并设置errno变量。在网络程序中,当我们向套接字文件描述符写时有两种可能:①write返回值大于0表示写了部分或者是全部数据。②返回值小于0,此时出现了错误,错误为eintr表示在写的时候出现了中断错误。如果为epipe表示网络连接出现了问题(对方已经关闭了连接)

 

  11.close()函数

   int close(int fd)

   close函数操作只是使相应socket描述字的应用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。

 

  12.socket中TCP的三次握手建立连接

   ①客户端向服务器发送一个SYN J(握手信号)

   ②服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1;

   ③客户端再向服务器发一个确认ACK K+1;

 

posted @ 2017-02-23 15:21  盗码笔记  阅读(203)  评论(0)    收藏  举报