socket的基本概念:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。(百度百科)
socket中传输数据时有两种套接字类型:流套接字和数据报套接字。
1.流套接字编程解析和编程思路
解析:服务器和客户端进行通行时,首先各自必须建立自己的套接字,建立连接后,对响应的套接字进行“写”和“读”操作,从而实现两者之间的数据传输。
编程思路: (1)在服务器端进程建立流套接字。
在选择网络类型时一般是AF_INET, 它代表因特网通信的意思. 在套接字类型中选择SOCK_STREAM,它表示流套接字。服务器端进程要优先于客户端启动。
(2)绑定本地地址到建立的套接字上,从而标识该套接字。
注意标识绑定套接字的句柄、地址、长度等,便于客户端连接。在c语言中,用sockaddr_in来标识tcp/IP下的协议下的地址,这样的好处是能够将
socketaddr_in强转换成sockaddr的结构。
struct sockaddr_in {
__uint8_t sin_len;
</pre></blockquote></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><pre name="code" class="objc">sa_family_t sin_family;//设置协议簇,设置成AF_INET,标识为网络通信
</pre></blockquote></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><pre name="code" class="objc">in_port_t sin_port; //指定服务端口
</pre></blockquote></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><pre name="code" class="objc">struct in_addr sin_addr;//无符号长整型,将IP地址保存成一个4字节的数,选择INADDR_ANY允许服务器监听你主机计算机上每个应用网络接口上的客户机活
char sin_zero[8];要传递的由协议决定的地址长度;填充字段,使之与sockaddr结构长度一样
};
(3)让套接字处于监听状态,而且能够接受客户端连接请求。
(4)客户端进程也调用socket的函数创建客户端套接字。
(5)客户端面向服务器端发出连接请求,建立一端的连接。
(6)服务器接受请求后,被堵塞服务进程函数会产生一个新的套接字和客户端套接字,并向客户发挥接受信号。
(7)当客户端的套接字收到服务器的接收信息,确定后客户端和服务器端建立连接,从而可以进行数据的“读” 和 “写” 操作。
(8)关闭套接字,释放资源。
还没有写数据报,等等