通过socket进行网络通信(服务端)

声明:此文只是为自己方便理解,做了一些具象的比喻和假设,并不符合客观事实,谨慎阅读!

​ 在一台主机中, 两个进程想要通信可以通过一个管道(文件):一个从管道的一端写,一个从另一端读 , 然而管道是半双工的 , 如果一个进程既想读又想写 , 那就创建两个管道。利用socket进行网络通信的过程与之类似:将对方主机抽象成一个全双工管道文件,为其创建文件描述符,对这个文件描述符进行读写。

创建监听套接字

int listen_fd = socket(AF_INET, SOCK_STREAM, 0);

​ 创建监听套接字的目的是监听是否有客户端连接该主机,但只有一个文件描述符客户端是找不到的,客户端是通过IP地址和端口找到需要通信的进程的,所以要将该listen_fd与IP地址和端口绑定,方便起见,将IP与端口定义成一个结构体。

监听套接字与端口绑定

// 先初始化IP + 端口 这个结构体
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
// 设置端口
server_addr.sin_port = htons(8080);
// 设置ip
inet_pton(AF_INET, "192.xx.xxx.xx", &server_addr.sin_addr.s_addr);
// 将监听套接字与 ip+端口绑定
bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(addr));

​ 现在网络上已经有一个“管道”通向服务器,其他主机想要通信并不是直接写这个“管道”,而是通过该“管道”再申请一个专门通信的“管道”。原因很简单,一个服务大众的人民公园不可能只设一个大门。于是,主机通过listen_fd监听到有人来通信,就新创建一个“管道”来通信。就好像住酒店,要先在前台(listen_fd)订房间(client_fd),然后房间(client_fd)里睡觉,而不能在前台(listen_fd)睡觉。

监听并接受一个新客户

listen(listen_fd);
// 此时有用户连接
//client_addr接受客户的地址信息:IP + 端口
struct sockaddr_in client_addr;
int client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);

读写,关闭

​ 此时就可以对client_fd进行读写;

char buf[1024];
read(client_fd,buf,sizeof(buf));

write(client_fd, buf, sizeof(buf));

close(client_fd);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章