1、变量定义:

(1)需要定义套接字类型变量,因为套接字存在于地址族中,可以将通过套接字通信的进程的公有特性综合在一起。套接字通常只与同一区域的套接字交换数据。Windows Sockets只支持AF_INET网络域,使用网际协议族通信的进程使用该域。因此只有将数据转换成Socket类型的数据才可以进行传输。

(2)定义地址结构体,用于存储协议族、ip地址以及端口号。其中,在地址结构体sockaddr_in中的sin_family部分指代协议族,也用于存放协议族信息,这一项在socket编程中只能是AF_INET,地址结构体sockaddr_in中的sin_addr部分用于存储ip地址,而sin_port部分则用于存储端口号

(3)定义双字节型数值Socket版本,这里必须要提及MAKEWORD函数,MAKEWORD函数的作用是将两个byte类型合并成一个双字节型,其中一个在高8位,另一个在低8位。将MAKEWORD函数合并成的双字节型值赋给双字节型数值sockVersion作为Socket版本。

(4)定义WSADATA类型的值,用来存储返回的Sockets数据。WSADATA是一种数据结构。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。

2、函数介绍:

在server程序中:

  1. 服务启动函数start():

    1. 该函数用于启动服务器,若启动成功返回0,启动失败则返回-1。其中应用到了WSAStartup函数,作用是启动WSA,这个函数的第一个参数为程序请求使用的Socket版本,第二个参数为返回请求的版本信息,返回值为0时成功。
    2. Socket函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源,3个参数分别为协议族、套接字类型和协议。另外,将对应的值分别存储到地址结构体中专门存放协议族、ip地址以及端口号的sin_family、sin_addr和sin_port。
    3. 除此之外,start()函数中还用到了库函数bind(),bind函数的作用是把socket与协议、ip地址、端口号绑定起来,由于bind函数的返回值表示绑定操作是否成功(0表示成功, -1表示不成功),因此可以对bind函数用if语句判断。bind函数中的第一个参数是待绑定的套接字,第二个参数是标识绑定在哪个“地方”,第三个参数则是这个“地方”的占地大小
    4. start函数中还用到了listen(),listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。listen函数的第一个参数表示被listen函数作用的套接字,第二个参数表示队列内核的上限。另外,listen函数返回值表示侦听是否成功(0表示成功, -1表示不成功),因此也可以对listen函数用if语句判断。

2. 服务停止函数stop():

该函数用于停止服务器,首先对startOK的值进行判断,若startOK的值已经被赋为0(服务器已经启动),则开         始关闭服务器。其中涉及到了closesocket函数,closesocket函数的作用和socket函数的作用相反,释放为套接字分         配的资源。而另一个用到的函数WSACleanup()则和WSAStartup函数的作用相反,终止对WSA的使用。

  1. 接收客户端连接函数acceptClient():

    1. 该函数用于接收客户端连接,其中涉及到的accept函数则用于接收客户端的请求,accept函数第一个参数是待连接的套接字,第二个参数是待连接地址结构体的“位置”,第三个参数则是地址指向“位置”的长度。
    2. 另外,inet_ntoa()为IP地址转换函数,用于把网络字节序IP转化点分十进制IP。而send()函数则用于发送数据,应用程序使用send函数向TCP连接的另一端发送数据,其中尤其需要注意的是send()函数的第四个参数,第四个参数为flags,一般置0。
    3. kbhit()函数是一个系统自带的库函数,用于判断键盘是否有按下,若键盘有按下则返回1,若键盘没有按下则返回0。
    4. acceptClient()函数中使用到的setsockopt()函数则用于套接口设置选项值,其中第一个参数是待设置的套接字,第二个参数表示选项定义的层次,第三个参数表示需设置的选项,其中SO_RCVTIMEO指超时时间,第四个参数表示指向存放选项值的缓冲区的指针,第五个参数则表示缓冲区长度,也就是int类型的长度。
    5. recv函数用于接收客户端的数据,其中需要注意的是它的第三个参数表示缓冲区长度,也就是最长能接收的缓冲数据量,第四个参数send()函数相同,意思也是为flags,一般也置0 。
  1. 菜单函数menu():                                                                                                                                                          仅仅用于输出菜单。
  2. 主函数main():                                                                                                                                                              使用while(1)来执行无限循环,并输出菜单。根据输入的值不断调用之前的那几个函数,当输入5时,执行exit(0)退出。

在client程序中:

  1. 连接服务器函数connectServer():

    1. 该函数用于连接服务器,若启动成功返回0,启动失败则返回-1。其中应用到了WSAStartup函数,作用是启动WSA,这个函数的第一个参数为程序请求使用的Socket版本,第二个参数为返回请求的版本信息,返回值为0时成功。
    2. Socket函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源,3个参数分别为协议族、套接字类型和协议。另外,将对应的值分别存储到地址结构体中专门存放协议族、ip地址以及端口号的sin_family、sin_addr和sin_port。
    3. 除此之外,connectServer()函数中还用到了库函数connect(),connect函数用于连接服务器,其中第一个参数是客户端的套接字,第二个参数是服务端的套接字所在的“地方”,第三个参数是该“地方”的大小,如果请求连接成功,则返回0,否则返回错误码。
    4. connectServer函数中还用到了inet_ntoa函数,inet_ntoa()为IP地址转换函数,用于把网络字节序IP转化点分十进制IP。
  1. 服务器对话函数ChatWithServer():

    1. ChatWithServer函数中用到了kbhit函数,kbhit()函数是一个系统自带的库函数,用于判断键盘是否有按下,若键盘有按下则返回1,若键盘没有按下则返回0。
    2. 其中通过判断connectOK的值来判断服务器是否已经连接,若connectOK的值为0则表示已经与服务器连接,可以进行接下来的对话步骤。
    3. buf缓冲区变量存放着要发送的数据,用gets函数来读字符串。首先用系统自带函数kbhit(),来判断键盘是否有按下,与之前相同,若键盘有按下,则读取缓冲区中要发送的数据,并调用send()函数。应用程序使用send函数向TCP连接的另一端发送数据。
    4. 对输入的数据进行判断,若输入的数据为"bye"、"再见"或者是"quit",则调用清屏函数,并输出菜单和停止函数。
    5. 设置recv的超时时间,超时则返回,不等待。这需要用到setsockopt函数,setsockopt()函数用于套接口设置选项值,它的第一个参数是待设置的套接字,第二个参数表示选项定义的层次,第三个参数表示需设置的选项,其中SO_RCVTIMEO指超时时间,第四个参数表示指向存放选项值的缓冲区的指针,第五个参数则表示缓冲区长度,也就是int类型的长度。
    6. 另外,还用到了recv(),recv函数用于接收客户端的数据,其中需要注意的是它的第三个参数表示缓冲区长度,也就是最长能接收的缓冲数据量,第四个参数send()函数相同,意思也是为flags,一般也置0 。
    7. 最后,用if进行判断,如果接收到的数据长度>0,则输出recvBuf[]中的数据并显示。对接收到的数据进行判断,若接收到的数据为"bye"、"再见"或者是"quit",则调用清屏函数,并输出菜单和停止函数。
  1. 客户端停止函数stop():

    1. 该函数用于停止客户端,首先对sockClient的值进行判断,若sockClient的值为1(客户端已经启动),则开始关闭客户端。其中涉及到了closesocket函数,closesocket函数的作用和socket函数的作用相反,释放为套接字分配的资源。
    2. 而另一个用到的函数WSACleanup()则和WSAStartup函数的作用相反,终止对WSA的使用。

使用C(或C++)语言编写网络通信模拟程序相关推荐

  1. c语言编写银行业务模拟程序,C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟 实现代码: #include #include #include #define MAX_WIN 20 #define MAX_STAY 100 typedef struc ...

  2. python语言小程序-微信小程序可以用Python语言编写吗?

    Q: 微信小程序可以用Python语言编写吗? A: 小程序一般开发HTML.CSS.JS,需要后台开发就需要PHP,MySQL等了.你说的这种语言开发小程序不好使.如果你不想学更多,建议你找一家专业 ...

  3. 使用WINSOCK的网络通信模拟程序 (客户机端)

    使用WINSOCK的网络通信模拟程序 (客户机端) 最近在做嵌入式的project过程中,学习了winsock网络编程,project主要的内容是在移植到stm32之前通过c语言对整个过程进行模拟:过 ...

  4. 使用WINSOCK的网络通信模拟程序(服务器端)

    使用WINSOCK的网络通信模拟程序 (服务器端) 最近在做嵌入式的project过程中,学习了winsock网络编程,project主要的内容是在移植到stm32之前通过c语言对整个过程进行模拟:过 ...

  5. java c语言 socket_网络通信 C语言 Socket TCP Select Server

    前言 工作中遇到各种各样的网络通信.有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议.使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始 ...

  6. C语言实现-----网络通信

    文章目录 C语言实现-----网络通信 网络编程就是编写程序使两台联网的计算机相互交换数据. 一 .基本原理 二.流程图: 三.核心函数包含: 四.函数介绍 1.socket 函数(套接字) 2.bi ...

  7. 用C语言编写万年历6,C语言编写万年历

    <C语言编写万年历>由会员分享,可在线阅读,更多相关<C语言编写万年历(8页珍藏版)>请在人人文库网上搜索. 1.C语言编写万年历 [要求]:1 程序运行后,首先在屏幕上显示主 ...

  8. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  9. R语言编写自定义函数计算R方、使用自助法Bootstrapping估计多元回归模型的R方的置信区间、可视化获得的boot对象、估计单个统计量的置信区间、分别使用分位数法和BCa法

    R语言编写自定义函数计算R方.使用自助法Bootstrapping估计多元回归模型的R方的置信区间.可视化获得的boot对象.估计单个统计量的置信区间.分别使用分位数法和BCa法(Bootstrapp ...

最新文章

  1. 多线程开发之---线程等待
  2. PHP操作使用Redis
  3. 学习使用 Manifest
  4. POJ 1195 Mobile phones(裸的二维树状数组)
  5. 每天进步一点点《ML - KNN》
  6. 复习:关于类的继承和构造函数
  7. eclipse、EditPlus等编辑器选中列(块)的方法
  8. 【ubantu18.04 有线网络驱动安装 r8215-9.007.01】
  9. 城通网盘文件地址分析器
  10. 拍摄视频,真的帧率越高越好吗?
  11. 颂钵带给我们是什么感受
  12. 收集最火的开源项目——PHP 篇
  13. Unity酱~ 卡通渲染技术分析(一)
  14. Linux内核之——等待队列wait queue
  15. Vue项目实战:订单列表页面实现
  16. android canvas 画圆边缘模糊,Android canvas画圆
  17. Ajax与Json的使用
  18. 正则表达式大写转小写
  19. cmd进入指定目录方法
  20. 更改mysql数据库主键自增时报错ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1

热门文章

  1. AxTools CodeSMART 2013 for VB6 完整版
  2. 【笔试】三七互娱笔试 JAVA服务端
  3. ADB命令判断手机是否锁屏
  4. 计算机专业学生如何应聘教师岗位
  5. window 下修改 babun 默认打开(HOME)路径
  6. 局域网搭建FTP服务器并进行访问
  7. P1197 [JSOI2008]星球大战 题解
  8. apm mysql5_apmserv 5.2.6 MySQL5.1启动失败,启动
  9. 使用TensorBoard进行超参数优化
  10. 入手了水獭掌柜最新款外卖打印机,打开了新世界的大门