socket通信基础笔记

socket具有不对称特性,服务端和客户端不同
socket_un用于进程间通信
socket_in用于网络通信

socket的相关概念
套接字描述符socket_fd——一个整数,由系统分配,和文件描述符类似,只在进程内有效

套接字属性——包括域(网络介质),类型(通信方式)和协议(传输机制)三个部分,使用socket函数创建套接字描述符时会用到

套接字地址socket_addr——结构体,如sockaddr_un/sockaddr_in、in_addr。不同的套接字域,其地址格式不同,对应的结构体也不同

使用bind函数绑定套接字地址和套接字描述符时需要用到;使用connect函数连接服务器端也会用到。


服务器端通信流程:

1.创建服务器端套接字描述符(用于接待) 

create server_socket_fd;

2.设置服务器端套接字地址 (客户端只有知道这个地址才能连接过来)

set server_socket_addr;

3.命名服务器端套接字(用bind函数,把套接字描述符和套接字地址绑定,此后套接字描述符就可以用来代指服务器套接字了)

bind  (server_socket_fd, server_socket_addr, addr_len);

4.开启服务器端监听(用listen函数,即有请求过来的时候会核对是不是要连接自己,原理可能是去系统注册了一下自己的套接字?)

listen (server_socket_fd,backlog);

5.接受来自客户端的连接(accept函数,会在服务器端新建一个接待专用的命名的客户端套接字描述符,注意这是一个阻塞的函数)【注意这里的不对称性,用户需要知道服务器地址才能连接,服务器是被动连接,所以不需要预先知道客户端的地址】

client_socket_fd=accept(server_socket_fd,client_socket_addr,addr_len);

6.对客户端套接字进行读写,实现通信;

write/read(client_socket_fd);

7.完成连接后关闭套接字描述符;【限制连接数需要在accept这一步进行计数操作,满额则停止监听,用setsockopt函数使能SO_REUSEPORT(允许重用本地地址)

close(client_socket_fd);

Q1:同一个进程内,一个地址是否可以同时分配给多个socket描述符?【un可以,in待确认】

客户端通信流程:

1.声明未命名套接字描述符;

create unname_socket__fd

2.设置服务器端套接字地址;

set server_socket_addr

3.进行连接(connect)【需要使用到套接字描述符和服务器的套接字地址】;

connect(server_socket_addr,unname_socket__fd,addr_len);//参数2需要做强制类型转换

4.连接成功后就可以像读写文件一样进行通信;

read/write(unname_socket__fd);

5.断开连接

close(unname_socket__fd);

关系是:用户程序读写unname_socket__fd-服务器程序读写server_socket_fd。

注意:每个套接字只能同时和一个点对点连接,其他的会被拒绝或进入队列。

猜你喜欢

转载自blog.csdn.net/linearf/article/details/80453270