Winsock是windows系统下利用Socket套接字进行网络编程的相关函数,是Windows下的网络编程接口。

Winsock在常见的Windows平台上有两个主要的版本,即Winsock1和Winsock2。编写与Winsock1兼容的程序你需要引用头文件WINSOCK.H,如果编写使用Winsock2的程序,则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件,它是专门用来支持在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H头文件时,同时需要库文件WSOCK32.LIB,使用WINSOCK2.H时,则需要WS2_32.LIB,如果使用MSWSOCK.H中的扩展API,则需要MSWSOCK.LIB。正确引用了头文件,并链接了对应的库文件,你就构建起编写WINSOCK网络程序的环境了。

一般来说,比较熟知的网络模型即OSI(Open system Interconnect)模型,它分为七层,即物理层,数据链路层,网络层,传输层,会话层,表示层以及应用层。而真正得到广泛应用的事TCP/IP 模型。在windows系统下,同样采用了TCP/IP模型进行不同主机以及不同网络间的通信。使用Winsock编程,即必须使用TCP/IP等相关协议进行通信。

在Winsock中,提供了TCP/IP协议下使用的套接字地址,即sockaddr_in结构体,在MSDN中查到其结构体的具体定义为:

其中:

  1. sin_family的值必须指定为AF_INET,代表所属地址家族是TCP/IP地址家族;
  2. sin_port代表端口号。我们知道,在TCP/IP协议,正是通过IP地址以及端口号实现端与端的通信。在TCP/IP协议中,有65536个端口号,因此指定为无符号short类型;
  3. in_addr同样是结构体。其结构为:

注:具体的使用方式以及注释都可查阅MSDN;

接下来本文将针对TCP协议具体实现进行简单的介绍。

针对上面的流程图,将对实现过程即相关函数进行介绍:

1、创建套接字:由于采用的是TCP协议,因此必须采用流式套接字,因为TCP协议采取的是字节流的方式进行传输数据的。

[cpp] view plaincopy
  1. socket s;
  2. s=::socert(AF_INET,SOCK_SREAM,0);

其中:


 最后一个参数指定为0的原因是因为在af中已经指定地址格式为TCP/IP协议规定的地址格式,因此最后一个参数协议类型指定为0;

2、绑定地址信息

使用函数bind()即可完成地址信息的绑定。这个过程完成的是套接字和地址信息的绑定。

参照代码:

[cpp] view plaincopy
  1. sockaddr_in addr;
  2. addr.sin_family=AF_INET;
  3. addr.sin_port=htons(80);
  4. addr.sin_addr.S_un.S_addr=INADDR_ANY;
  5. ::bind(s,(sockaddr)&addr,sizeod(addr));

3、作为TCP服务器必须处于监听状态,随时监听客户端的连接请求。这个过程是通过listen()函数实现的。

4、客户端发送连接请求。该函数于bind函数的结构类似。

这里的sockaddr定义的地址指针是服务器的地址指针;

5.服务器接受客户端的连接请求。实现函数为accept(),结构和connect()以及bind()类似,不同的是定义的结构指针应该为客户端的地址指针;

最后将TCP协议的实现代码贴在本文,实现平台是Visual c++6.0中建立控制台应用程序实现。

服务器代码:

[cpp] view plaincopy
  1. #include <winsock2.h>                       //包含头文件
  2. #include  <stdio.h>
  3. #include  <windows.h>
  4. #pragma comment(lib,"WS2_32.lib")           //显式连接套接字库
  5. int main()                                  //主函数开始
  6. {
  7. WSADATA data;                           //定义WSADATA结构体对象
  8. WORD w=MAKEWORD(2,0);                   //定义版本号码
  9. char sztext[]="欢迎你\r\n";                //定义并初始化发送到客户端的字符数组
  10. ::WSAStartup(w,&data);                  //初始化套接字库
  11. SOCKET s,s1;                            //定义连接套接字和数据收发套接字句柄
  12. s=::socket(AF_INET,SOCK_STREAM,0);      //创建TCP套接字
  13. sockaddr_in addr,addr2;                 //定义套接字地址结构
  14. int n=sizeof(addr2);                    //获取套接字地址结构大小
  15. addr.sin_family=AF_INET;                //初始化地址结构
  16. addr.sin_port=htons(75);
  17. addr.sin_addr.S_un.S_addr=INADDR_ANY;
  18. ::bind(s,(sockaddr*)&addr,sizeof(addr));    //绑定套接字
  19. ::listen(s,5);                              //监听套接字
  20. printf("服务器已经启动\r\n");              //输出提示信息
  21. while(true)
  22. {
  23. s1=::accept(s,(sockaddr*)&addr2,&n);    //接受连接请求
  24. if(s1!=NULL)
  25. {
  26. printf("%s已经连接上\r\n",inet_ntoa(addr2.sin_addr));
  27. ::send(s1,sztext,sizeof(sztext),0); //向客户端发送字符数组
  28. }
  29. ::closesocket(s);                       //关闭套接字句柄
  30. ::closesocket(s1);
  31. ::WSACleanup();                         //释放套接字库
  32. if(getchar())                           //如果有输入,则关闭程序
  33. {
  34. return 0;                           //正常结束程序
  35. }
  36. else
  37. {
  38. ::Sleep(100);                       //应用睡眠0.1秒
  39. }
  40. }
  41. }

客户端代码:

[cpp] view plaincopy
  1. #include <winsock2.h>               //包含头文件
  2. #include  <stdio.h>
  3. #include  <windows.h>
  4. #pragma comment(lib,"WS2_32.lib")       //显式连接套接字库
  5. int main()                          //主函数开始
  6. {
  7. WSADATA data;                       //定义WSADATA结构体对象
  8. WORD w=MAKEWORD(2,0);                   //定义版本号码
  9. ::WSAStartup(w,&data);                  //初始化套接字库
  10. SOCKET s;                       //定义连接套接字句柄
  11. char sztext[10]={0};
  12. s=::socket(AF_INET,SOCK_STREAM,0);          //创建TCP套接字
  13. sockaddr_in addr;                   //定义套接字地址结构
  14. addr.sin_family=AF_INET;                //初始化地址结构
  15. addr.sin_port=htons(75);
  16. addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
  17. printf("客户端已经启动\r\n");              //输出提示信息
  18. ::connect(s,(sockaddr*)&addr,sizeof(addr));
  19. ::recv(s,sztext,sizeof(sztext),0);
  20. printf("%s\r\n",sztext);
  21. ::closesocket(s);                   //关闭套接字句柄
  22. ::WSACleanup();                     //释放套接字库
  23. if(getchar())                       //如果有输入,则关闭程序
  24. {
  25. return 0;                   //正常结束程序
  26. }
  27. else
  28. {
  29. ::Sleep(100);                   //程序睡眠
  30. }
  31. }

windows网络编程相关推荐

  1. 十年一遇的奇葩故障--Windows网络编程接口故障:telnet显示无法加载或初始化请求的服务提供程序...

    现象:某同事的笔记本win7x64系统,当初故障是无法使用小乌龟连接到svn服务器,但又可以正常上网,并且svn服务器端是正常的. 后来我进一步测试,发觉该电脑也不能连接到远程windows. net ...

  2. Windows网络编程案例教程-董相志 学习记录 第一个网络程序hostent

    <Windows网络编程案例教程>-董相志 学习记录 第一个网络程序hostent 第一章 网络编程概述 1.3.5第一个网络程序--hostent 对主机的名称和地址解析 WinSock ...

  3. windows网络编程——telnet协议

     1.windows网络编程--telnet协议 Telnet是最老的Internet应用,起源于1969年的ARPANET,名字是"电信网络协议(TelecommuicationNetwo ...

  4. Windows 网络编程

    欢迎访问我的博客首页. Windows 网络编程 1. 交替收发 1.1 客户端 1.2 服务器 2. 粘包问题 2.1 客户端 2.2 服务器 3. 双工通信 4. 附录 4.1 Java 中 in ...

  5. c++ windows网络编程--udpSocket之recfrom()函数阻塞问题

    在windows网络编程中,创建udp socket,然后调用recfrom()函数进行数据接收,发现当没有数据发送来时,会一直阻塞在recfrom()里面.为了避免因阻塞而占用CPU资源,所以不能一 ...

  6. SOCKETS规范及应用-WINDOWS网络编程接口

    Windows   Sockets   规范及应用                           -Windows网络编程接口     ***************************** ...

  7. Windows网络编程入门:简单的客户端和服务器通信程序调试

    昨日入手Windows网络编程经络这本书,第一章给了Echo客户端和服务器的简单通信实例程序.从小白到入门目测都是比较苦逼,居然想不到怎么来测试结果.什么同时运行啊.分别编译运行啊乱七八糟的想法就开始 ...

  8. 《Windows网络编程案例教程》-董相志 学习记录 阻塞/非阻塞套接字编程

    <Windows网络编程案例教程>-董相志 学习记录 阻塞/非阻塞套接字编程 2.3 阻塞/非阻塞套接字编程 阻塞套接字编程通信流程图 2.3.1 阻塞套接字客户机编程 1.启动并初始化W ...

  9. Windows网络编程,报错error: ‘getpid‘ was not declared in this scope

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...

  10. Windows网络编程(一)基础

    Table of Contents 准备工作 socket C/S模式 源代码 服务端 客户端 源码分析 数据传输 关闭连接 符号解释 WSAStartup sin_family sin_port i ...

最新文章

  1. html 后台参数attribute_平台管理后台与商家菜单资源管理:商家权限及其菜单资源管理设计...
  2. springboot 启动后打印_SpringBoot实战(五):配置健康检查与监控
  3. web安全day30:人人都要懂的LAMP--apache服务安装和配置
  4. php屏蔽中文浏览器,网站屏蔽中文浏览器/英文浏览器方法
  5. 特征检测和特征提取算子
  6. 动态为Spring Boot项目中所有自定义的Controller添加过滤器的两种方法
  7. 股票学习-量柱和k线-第一天
  8. js msgbox 插件
  9. 随处可见抢眼美女 TechED盛宴人潮汹涌
  10. 湖北移动CM201-1-CH _S905L3B-UWE5621DS_线刷固件包
  11. PLSQL存储过程定时作业(DBMS_JOB)
  12. 会计 应用计算机,会计从业会计电算化:计算机的主要应用
  13. K-means聚类实现图片分割
  14. 原生Servlet的编写
  15. 西北工业大学-技术经济学-MOOC课程截图笔记
  16. 系统集成项目管理工程师-第三章 信息系统集成专业技术知识
  17. 竞价账户创意如何编辑,干货奉上
  18. ORACLE 统计各个部门 工资级别为小于2000,2000-3000,3000+的分别为多少
  19. 百个增量配电PPP项目将公布 千亿投资逐鹿电改工业园试点
  20. 从DPU看未来网络架构的演进趋势

热门文章

  1. 电话用计算机接听,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
  2. CRMEB小程序商城源码,好多程序员都在用的开源商城源码
  3. 如何防范短信接口被恶意攻击
  4. 2018年高教社杯全国大学生数学建模竞赛A题解题思路
  5. CSS引用外部字体的方法
  6. redis基础知识——菜鸟教程
  7. 群晖nas存储系统原理_群晖NAS入门教程第四节:群晖存储空间管理员功能和磁盘阵列类型的简介...
  8. 抢占自动驾驶「制高点」,传统Tier1巨头「砸钱入场」
  9. 【JavaSE】黑马程序员 刘意 基础部分笔记
  10. gwr模型用什么做_干货|教你如何用Stata做二元选择模型