网络编程知识点

网络编程

1、网络中进程之间如何通信?

本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类:消息传递(管道、FIFO、消息队列)
同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
共享内存(匿名的和具名的)
远程过程调用(Solaris门和Sun RPC)

2、三次握手和四次挥手

三次握手

客户端向服务器发送一个SYN J
服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
客户端再想服务器发一个确认ACK K+1
只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:
在这里插入图片描述
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

四次挥手
上面介绍了socket中TCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过程,请看下图:
在这里插入图片描述
图2、socket中发送的TCP四次握手
图示过程如下:
某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
接收到这个FIN的源发送端TCP对它进行确认。
这样每个方向上都有一个FIN和ACK。

3、函数

(1) Socket函数

#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);

Socket函数详细介绍

(2)bind函数

bind函数赋予socket “协议, ip地址, 端口号” 属性,服务器在启动时捆绑它众所周知的端口。
对于服务器,则限定了该套接字只能接收那些目的地为这个IP地址的客户连接。
TCP客户端通常不把IP地址捆绑到它的套接字上。当连接套接字时,内核将根据所用的外出网络接口来选择源IP地址,而所用外出接口则取决于到达服务器所需的路径。

NAME
       bind - bind a name to a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

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

第一个参数为socket文件描述符;
第二个参数,传入sockaddr 类型结构体,配置socket的网络地址和端口;
第三个参数为长度;

一般用法:

bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);
s_add.sin_port=htons(portnum);
if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))){
   
		printf("bind fail !\r\n");
		return -1;
	}

(3)accept函数

accept()是在一个套接口接受的一个连接。accept()是c语言中网络编程的重要的函数,本函数从s的等待连接队列中抽取第一个连接,创建一个与s同类的新的套接口并返回句柄。

(4)listen函数

1.作用
listen函数的作用是把一个未连接的套接字转换为被动套接字,指示内核应该接受指向该套接字的连接请求。使套接字从CLOSED状态转换到LISTEN状态。

#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
//返回0成功,-1失败;

(5)connect和accept函数

服务器调用accept函数接收客户端连接,一直阻塞到有连接请求,accept返回标识符;
客户端用connect请求连接;

NAME
      connect - initiate a connection on a socket

SYNOPSIS
      #include <sys/types.h>
      #include <sys/socket.h>
//成功返回0,失败返回-1;
      int connect(int sockfd, 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值