分享

套接字编程(VC

 bylele 2013-06-20

目录

套接字概述
相关函数
套接字编程

(本章节中例子都是用 VS2005 编译调试的)

相关文献:

Socket模型详解(转)

Socket通信中的多进程编程实例


套接字概述

简介(源于维基)

Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口。然而,由于AT&T的专利保护着UNIX,所以只有在1989年Berkeley大学才能自由地发布自己的操作系统和网络库。
Berkeley套接字接口,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程间可以通讯。 它可以在很多不同的输入/输出设备和驱动之上运行,尽管这有赖于操作系统的具体实现。 接口实现用于TCP/IP协议,因此它是维持Internet的基本技术之一。 它是由加利福尼亚的伯克利大学开发,最初用于Unix系统。 如今,所有的现代操作系统都有一些源于Berkeley套接字接口的实现,它已成为连接Internet的标准接口。
套接字接口的接入有三个不同的级别,最基础的也是最有效的就是raw socket级别接入。 很少的应用程序需要在外向通讯控制的这个级别接入,所以raw socket级别是只为了用于开发计算机Internet相关技术的。 最近几年,大多数的操作系统已经实现了对它的全方位支持,包括Windows XP。

应用程序网络数据传输

  • 端口:
    • 定义:    一种抽象的软件结构,应用程序通过系统调用与某端口建立连接后,传输层给该端口的数据都被相应的进程接收,相应的进程发给传输层的数据都通过该端口输出
    • 端口号:   一个整形标示符,来表示端口,取值为0~65535,1024以下的端口保留给预定义的服务
    • 注意:    TCP/IP传输层的两个协议TCP与UDP是完全独立的两个软件模块,因此各自端口独立,也就是说TCP/UDP可以拥有相同的端口号
  • IP 地址:
    • 所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节

套接字

  • 说明
    • 套接字存在于通信域中,通信域也叫地址簇,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性,综合在一起,套接字通常只与同一区域的套接字交换数据,(也可能跨区通信,但这只是在执行某种转换进程后才能实现).Windows Sockets只支持一个通信域,网际域(AF_INET),这个域被使用网际协议簇通信进程使用
  • 套接字类型
    • SOCK_STREAM    流式套接字,提供面向连接的数据传输服务,数据无差错,无重复的发送,并且按发送顺序接送,流式套接字实际上是基于TCP实现的
    • SOCK_DGRAM      数据报式套接字,提供无连接服务,数据包以独立包形式发送,不提供无错保证,数据可能存在丢失或重复,并且接受顺序混乱,数据报式套接字实际上是基于UDP协议实现的
    • SOCK_RAM      原始套接字

网络字节顺序(套接字与地址簇中使用)

由于不同的计算机存放数据字节的顺序不同,所以通信双方必须协商出统一的存放字节顺序,这样才能发送方的数据可以被接收方准确无误的读取,否则接收方读到的是一堆不知名的数据,所以通信前双方必须协商统一的用网络字节顺序,保证通信的正常进行

基于消息的异步套接字

  • 两种模式 (Windows套接字在两种模式下执行I/O操作)
    • 阻塞     在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)
    • 非阻塞    在非阻塞模式下,Winsock函数无论如何都会立即返回
  • 消息驱动
    • Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略
    • Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息

C/S模式 


相关函数

[win32 API 相关套接字函数][相关结构体及宏][基于消息的套接字编程][MFC套接字相关函数]

Win32 API 相关套接字常用函数

显示相关函数

相关结构体及宏

显示相关函数

基于消息套接字编程相关相关函数

显示相关函数

MFC常用函数

显示相关函数

TCP套接字相关函数

显示相关函数

UDP套接字相关函数

显示相关函数

编写套接字通信

[编写基于 UDP 套接字通信][编写基于 TCP 套接字通信][编写基于消息机制的 UDP 套接字通信][通过域名获得 IP 地址]

编写基于 UDP 套接字通信

流程图:

代码示例:

查看本机 IP

服务器端

View Code

客户端

View Code

运行结果(先运行服务器,再运行客户端.然后结果为下图所示上面为服务器下面为客户端)

编写基于 TCP 套接字通信

流程图:

 

代码示例:

查看本机 IP

服务器端

View Code

客户端

View Code

运行结果(先运行服务器,再运行客户端.然后结果为下图所示上面为服务器下面为客户端)

编写基于消息机制的 UDP 套接字通信

流程图:

程序代码(源于孙鑫第十六讲代码):

先添加一个对话框工程工程工程名为 Chat ,因为服务器和客户端这里写在一起所以就一个工程就好.

资源界面设计

相关代码 

在 stdafx.h 头文件中加载动态连接库的引入库和相关头文件

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

在程序初始化的时候, 加载套接字库和进行套接字库协商,这个工作放在 Chat.cpp ,主线程的初始化工作函数 InitInstance 中.

View Code

接着来定义一个网络事件,和网络事件响应函数

View Code

定义好网络世界和网络世界响应函数后我们来进行套接字的创建和和端口绑定,以及网络事件注册,这个功能我们封装在 InitSocket 并且在对话框初始化时候我们就打算调用它.

View Code

在定义发送按钮消息事件让其能发送对应消息

View Code

运行结果

 

通过域名获得 IP 地址

相关函数:

代码示例:

View Code

运行结果:

在控制台中 ping www.baidu.com 的运行结果:

分类: VC

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多