lantionzy

coding
posts - 10, comments - 39, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
   注:本系列文章适合初学网络编程的读者
   
   网络程序的实现可以有很多方式,Windows Socket就是其中一种比较简单的方法。socket是连接应用程序与网络驱动程序的桥梁,socket在应用程序中创建,通过绑定操作与驱动程序建立关系。此后,应用程序送给socket的数据,由socket交给驱动程序向网络上发送出去。计算机从网络上收到与该socket绑定的IP地址和端口号相关的数据后,由驱动程序交给socket,应用程序便可从该socket中提取接收到的数据。
   在TCP/IP网络应用中,通信的两个进程间相互作用的主要是(client/server)模式,即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。
   下面通过一个简单的实例来讲述基于TCP的socket编程的通信流程。其中服务器端程序实现代码TCPSrv.cpp如下:
Server
   在这段代码中,首先定义了一个WORD类型的变量:wVersionRequested,用来保存WinSocl库的版本号,接着调用MAKEWORD宏创建一个包含了请求版本号的WORD值,之后调用WSAStartup函数加载套接字库,如果其返回值不等于0 ,则程序退出。接下来判断wsaData.wVersion的低字节和高字节是否都等于1,如果不是我们请求的版本,那么调用WSACleanup函数终止对Winsock库的使用并返回。
   加载套接字库后,就可以按照一定流程来编写实现代码了:
   1、创建套接字(socket)
   利用socket函数创建套接字,对于它来说,第一个参数只能是AF_INET或(PF_INET);本例是基于TCP协议的网络程序,需要创建的是流式套接字,因此将socket函数第二个参数设置为SOCK_STREAM;将其第三个参数指定为0。这样该函数将根据地址格式和套接字类别,自动选择一个合适的协议。
    2、将套接字绑定到一个本地地址和端口上(bind)
   在SOCKADDR_IN结构体中,除了sa_family成员外,其他成员都是按网络字节顺序表示的。因此使用htonl函数将INADDR_ANY值转换为网络字节顺序。调用bind函把套接字sockSrv绑定到本地地址和指定端口上。其第一个参数为要绑定的套接字,第二个需要一个指针,可以用取地址符来实现,并且addrSrv变量是SOCKADDR_IN结构体类型,而这里需要的是SOCKADDR*类型,所以要进行强制转换。第三个参数是指定地址结构的大小,可以利用sizeof操作符来获取。
   3、将套接字设为监听模式(listen),准备接收客户请求。其中listen函数第二个参数是指等待连接队列的最大长度。
   4、等待客户请求的到来;当请求到来后,接受连接请求,返回一个新的对应于此连接的套接字(accept)。
   接下来,需要调用accept函数等待并接受客户的连接请求。因为作为服务器端,它需要不断的等待客户端的连接请求的到来,所以设计成一个死循环。当客户端有请求时,该函数接受请求建立连接,同时返回一个相对于当前这个新连接的一个套接字描述符,保存于sockConn变量中,然后利用这个套接字就可以与客户端进行通信了,而我们先前的套接字仍继续监听客户端的连接请求。
   5、用返回的套接字和客户端进行通信(send/recv)
   可以调用send函数向客户端发送数据,注意这里使用的套接字是已建立连接的那个套接字:sockConn,而不是用于监听的那个套接字:addrSrv。使用recv函数从客户端接收数据。
   6、返回等待另一个客户请求
   7、关闭套接字

   上面实现的服务器端的程序,下面是客户端程序实现代码TCPClient.cpp:
Client
   对于客户端来说,它不需要邦定,可以直接连接服务器端。

   首先运行服务器端程序,然后再运行客户端程序,可以看到客户端收到了服务器端返回的信息:Welcome 127.0.0.1 to http://www.cppblog.com/lantionzy,而服务器端收到了客户端发送的信息:This is lantionzy。

剖析网络编程(2)-- 基于UDP的的网络应用程序
剖析网络编程(3)-- 基于TCP/UDP网络编程应注意的几个地方

Feedback

# re: 网络编程--实例分析(1)-- 基于TCP的的网络应用程序  回复  更多评论   

2009-10-19 14:49 by 戴尔电脑
使用recv函数从客户端接收数据

# re: 网络编程--实例分析(1)-- 基于TCP的的网络应用程序  回复  更多评论   

2009-10-19 15:07 by lantionzy
流式套接字提供没有记录边界的数据流:可以是双向的字节流(应用程序是全双工:可以通过套接字同时传输和接收)。可依赖流传递有序的、不重复的数据。(“有序”指数据包按发送顺序送达。“不重复”指一个特定的数据包只能获取一次。)这能确保收到流消息,而流非常适合处理大量数据。
数据文报套接字支持双向数据流,此数据留不能保证按顺序和不重复送达。数据文报也不保证是可靠的;它们可能无法到达目的地。数据文报可能不按顺序到达并且可能会重复,但只要记录的大小没有超过接收端的内部大小限制,就会保持数据中的记录边界。您负责管理顺序和可靠性。(可靠性在局域网 [LAN] 上往往很好,但在广域网 [WAN] 如 Internet 上却不太好。)数据文报为“无连接”的,也就是不建立显式连接。可将数据文报消息发送到指定的套接字,然后从指定的套接字接收消息。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理