Socket套接字

原文:http://cao4141.blog.163.com/blog/static/6867041320100292535459/ 

Socket(套接字)是一种网络编程接口,一个套接字是通信的一端.它意味着Socket用来让一个进程和其他的进程互通信息,就像人们通过手机来和其他人交流一样.Socket是主要的TCP/IP网络的API之一.Socket接口定义了许多函数,开发人员可以用它们来开发TCP/IP网络的应用程序.网络的Socket数据传输是一种特殊的I/O.
套接字被使用时,都有其类型和相关进程.套接字存在于通信域中(Windows Sockets规范支持单一的通信域,即Internet域),各个进程使用该域的套接字,相互之间用Internet协议族来进行通信.套接字可以根据通信性质分类,该性质对于用户是可见的.应用程序一般仅在同一类的套接字之间通信,不过只要底层的通信协议允许,不同类型的套接字之间也可以通信.
常用的套接字有3种类型:流式套接字(SOCK-STREAM),数据报式套接字(SOCK-DGARM)和原始套接字(SOCK-RAW).
流式套接字是一种面向连接的套接字,对应于面向连接的TCP服务应用.数据报式套接字是一种无连接的套接字,对应于无连接的UDP服务应用.原始套接字对应于无连接的IP服务应用.流式套接字的使用与数据报套接字一个很大的不同:在使用流式套接字传输数据之前,必须在数据传输的发送和接收端之间建立连接,而在使用数据报套接字之前不必建立连接.在数据传输时,如果已经建立健全的连接断开,应用程序会被通知.

Socket程序设计
Socket套接字网络编程取决于客户/服务器模式.Socket提供两种形式的套接字:面向无连接的用户数据报(UDP)和面向流式传输.
1.数据报Socket使用方法
大多数的数据报应用程序使用的是比较固定的事件序列来完成客户应用程序和服务器应用程序的通信.在两通信前,无需先建立连接.首先由客户端向服务器发出数据.然后服务器通过发来的数据报就可以知道客户端的IP地址以及端口号,双方就可以通信了.其使用过程如图:

数据套接字的服务器和客户端的地位是对等的,没有明显区别.数据报无连接通信的具体实现步骤如下:
(1)使用函数Socket()用于创建一人套接字.
(2)使用函数bind()绑定本机的IP地址和端口.
(3)使用需要指定目的IP地址的函数sendto()向指定IP地址的机器发送消息.
(4)使用需要指定消息源地址的函数recfvfrom()接收来自指定地址的消息.
(5)最后使用函数closesocket或close()关闭套接字连接.
流式Socket使用方法
流式套接字使用的是基于连接的协议,所以其使用方法与数据报套接字的使用方法不同.用户在传输,接收数据之前必须首先建立连接,然后才能从数据流中读出数据,而不是从一个数据报或一个记录中读出数据.基使用方法如下:

 

流式套接字的服务器进程和客户进程在通信前必须使用函数Socket()创建各自的套接字,然后使用函数bind()绑定本机的IP地址和端口.服务器调用函数listen()建立一个监听端口,监听客户端请求,并调用函数accept()等待客户端的连接请求.客户端使用函数connect()用于请求与指定IP地址的服务器端口建立连接.连接建立后,客户端与服务器就可以用函数sent()和Recv()进行通信.最后调用函数closesocket()或close()关闭套接字连接.

MFC套接字编程
MFC对Windows Sockets进行了面向对象的封装.它将Windows Sockets封装成类CAsyncSocket和类CSocket,提供给开发人员一些主要的接口,而将细节屏蔽了.
(1)CAsyncSocket类封装了WindSock API函数,宏观经济提供的低级接口几乎和WindSockAPI的函数调用直接对应.
(2)CSocket类是从CAsyncSocket类派生而来的,它提供了高一级的抽象处理套接字通信.
(在MFC中使用套接字时,要在应用程序内函数InitInstance()中调用AfxSocketInit()函数业初始化套接字.即当使用应用程序向导创建程序的基本框架时,要选中"windows套接字"复选框).

猜你喜欢

转载自sunnymelon.iteye.com/blog/1183958