unix网络编程的基本步骤

时间:2021-01-12 22:13:47

为了便于记忆,今天将网络编程的一些基本理解写下来


首先,套接字是通信端点的抽象,它类似与一个底层的描述符,是用来描述网络通信的载体.

因为他类似与文件描述符,所以可以用操作文件描述副的一些函数来操作它,比如read,write,fcntl等等,但是lseek不能用于socket..


如果CS架构是基于TCP的通信则需要以下几个步骤:


服务端:

 1.创建socket:利用socket函数创建socket,它返回一个套接字文件描述符,需要指定套接字类型为SOCK_STREAM

2.绑定一个主机地址:使自己的套接字描述符和自己的ip有.用函数bind()

3.监听客户程序:此程序是一个死循环,用函数listen(),第二个参数为该进程所要入队的连接最大请求数量,具体值可以自己指定,最大值在sys/socket.h中的SOMAXCONN指定

4.接收客户请求:当服务程序调用listen开始监听以后就可以调用accept()函数来接收客户的连接请求了,它返回一个套接字描述符,该描述符与客户端连接.它和传给accept的原始套接字具有相同的套接字类型和地址族,但是并不是将原始的关联到返回的描述符,原始的描述符会继续等待和别人的连接.另外需要注意的是accept是阻塞式的.服务器也可以使用poll或者select来等待一个请求.IO多路转接技术我会再重新发一个博文讨论下.

5.和客户端交换数据,用文章开头提到的函数即可,描述符为accept的返回值.也可以利用send,sendto,sendmsg,recvrecvfrom,recvmsg,recv六个函数进行操作.这六个函数都可以指定一个flag参数,它的最长用参数为MSG_OOB, man中称作out of band data,即发送的是一个紧急 的数据,它将以最快的速度发送出去.

6.关闭套接字描述符:close()


客户端:

1.和服务端一样,创建socket:利用socket函数

2.建立连接:因为tcp是面向连接的,所以在数据传输之前需要建立连接.利用connect函数,它不是阻塞式的,所以尽量的做成一个循环.
3.和服务器交换数据:利用服务器端步骤第五条中所说的那几个可以使用的函数
4.关闭socket: close();

    基于UDP协议服务器端编程步骤
 1.创建socket:和上面相同,但是要指定正确的套接字类型:socket(AF_INET,SOCK_DGRAM,0)
 2.绑定主机:依然是利用bind()
 3.接收客户请求:因为UDP是面向无连接的,所以不用监听端口,可以利用recvfrom收到客户端的
 4.向客户发送信息:sendto(),它不用指定地址。
 5.关闭socket :close()

   

基于UDP协议客户端编程步骤

1.创建socket:socket()
2.给服务器发信息:sendto(),他和send的区别为,他可以在无连接的套接字上指定一个目标地,址,因为如果是面向连接的操作的话地址是包含在连接过程中的,属于协议栈的问题,而不是系统编程应该考虑的。

3.接收服务端响应:recvfrom(),主要的目的是获取发送者的源地址信息,利用地址信息才能建立一个连接通路,并且把从服务器传过来的数据存放在函数的第二个参数中。

4.关闭socket:close