socket套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为Client Socket,另一个运行于服务器端,我们称之为Server Socket
socket的三次握手:
三次握手只是一个数据传输的过程,但是,我们传输前需要一些准备工作,比如将创建一个套接字,收集一些计算机的资源,将一些资源绑定套接字里面,以及接受和发送数据的函数等等,这些功能接口在一起构成了socket的编程
server服务端:
client客户端:
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。 网络字节顺序与本地字节顺序之间的转换函数:
htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"
之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO
如 Intel x86结构下, short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12
如 IBM power PC结构下, short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78
假设服务端端口号是8888
# adb shell
# netstat -ap |grep 8888
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 2596/***_service
tcp 0 0 localhost:8888 localhost:45634 ESTABLISHED 2596/***_service
tcp 0 0 localhost:8888 localhost:45632 ESTABLISHED 2596/***_service
tcp6 0 0 localhost:45634 localhost:8888 ESTABLISHED 5336/com.***.upgrade
tcp6 0 0 localhost:45632 localhost:8888 ESTABLISHED 5002/com.***.engineeringmode
UNIX网络编程(基本TCP套接字编程78页)给出了一个解释说的是:当我们关闭客户端后,客户端会发送一个数据(EOF,也就是0)
然后服务端通过read()
函数收到这个数据,,知道了客户端已经退出,所以服务端也就退出了程序,并且调用相应的close操作