在网络通信应用程序的编程中用到的socket,严格称来应该是socket APIs,它是一组将TCP/UDP/IP协议层的接口函数进行封装后的,供给应用程序调用的应用层接口函数。OSI的7层通信模型中,在网络通信中用到的是应用层(就是我们编写的应用程序,如用vc6.0编译生成的.exe)、传输层(TCP/UDP协议都属于传输层)、网络层(IP协议)、链路层(网卡中以太网的编解码器)、物理层(将2进制数据转换成高低电平)这5层。其中链路层、物理层大多属于硬件部分,之上三层为软件部分。网络通信应用程序编程就是针对应用、传输、网络三层的实现。
在应用中存在多种封装好的应用层接口函数APIs,其中socket APIs应用最为广泛。通信模式采用C/S模式,client位于本地PC,server位于与本地PC在同一子网(与本地PC在同一路由之下就可以)内的远程PC上。
server端,在使用Socket之前必须调用WSAStartup函数对winsock服务初始化,之后才能在应用程序中调用winsock APIs。而socket APIs就是包含在winsock.h或winsock2.h中的。之后进入socket APIs的调用过程。
1、socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)为在服务器端创建套接字,返回值为套接字描述符,其实是对应套接字的句柄(可以先理解为本套接字信息所在内存首地址的指针,系统内核可以通过该句柄找到套接字信息所在内存地址);AF_INET代表TCP服务,SOCK_STREAM流传输,IPPROTO_TCP为TCP协议类型。
创建套接字成功后,需要定义sockaddr_in类型的变量saddr存放本套接字的端口和IP,之后调用bind(sFD,(SOCKADDR*)&saddr,sizeof(SOCKADDR))来绑定此套接字和此端口。
绑定成功后,服务器通过启动listen()来侦听有无客户端呼叫本服务器。
如若有客户端呼叫,server会调用accept()函数,此函数返回值为一个新的socket型变量,因此在之前,我们需要再预备一套套接字的定义,即再定义一个socket和sockaddr_in型的变量用来和client通信,而最开始定义的socket用来侦听网络中其他client的呼叫。至此server端的连接完成,可以调用recv和send进行数据传输了。
2、client端相对简单,也是先WSAStartup初始化,然后socket(AF_INET, SOCK_STREAM,IPPROTO_TCP)为在客户端创建套接字,之后把远程服务器的IP和端口号放入定义sockaddr_in型变量中,调用connect()函数,将client套接字通过该变量(该变量存放了远程服务器的IP和端口等信息)连接,形成信息通道。再次强调,client端的sockaddr_in型变量存放的是远程服务器的IP和端口,为的是能够使client寻址到server。(在这里犯的错误使得socket弄了一天都没通上)
最后附上个人觉得很有参考价值的几个链接,对初学者很有帮助。
socket APIs的详细定义
http://blog.csdn.net/hurtmanzc/article/details/1561840
socket基本概念
http://www.ibm.com/developerworks/cn/aix/library/0807_liugb_tcpip/
Windows下c语言socket编程
http://blog.csdn.net/oinux/article/details/8525823
文章评论(0条评论)
登录后参与讨论