socket服务器端编程的基本步骤:

1.1 准备Windows服务器端开发环境

导入ws2_32.lib静态连接库,项目属性->配置属性->链接器->输入->附加依赖项中添加ws2_32.lib。

1.2 设置Winsock版本并初始化相应版本的库

int WSAStartup(WORD wVersionRequsted,LPWSADATA lpWSAData);
wVersionRequested--要用的Winsocket版本,通常填入MAKEWORD,如MAKEWORD(2,2),表示主版本号是2,副版本号也是2
lpWSAData--WSADATA结构体变量的地址,调用完函数后,相应的参数将填充已经初始化的库信息,无特殊含义。

1.3 创建socket

SOCKET socket(int af,int type,int protocol);
af--通信协议族,常用的AF_INET,AF_INET6等
type--通信类型,SOCK_STREAM面向连接的可靠的传输方式;SOCK_DGRAM面向消息的非可靠的传输方式。
protocol--协议类型,通常为0
返回值--成功返回创建的SOCKET句柄,失败返回INVALID_SOCKET

1.4 绑定地址信息

int bind(SOCKET s,const struct sockaddr* addr,int namelen);
s--SOCKET句柄
addr--存放服务器通信地址信息的结构体信息
namelen--上述结构体变量的长度
返回值--成功返回0,失败返回SOCKET_ERROR

1.5 开启监听

int listen(SOCKET s,int backlog);
s--服务器端的SOCKET句柄
backlog--可容纳连接队列的最大成员数
返回值--成功返回0,失败返回SOCKET_ERROR

1.6 接收客户端连接

SOCKET accept(SOCKET s,struct sockaddr* addr,int* addrlen);
该函数为阻塞函数,成功接收到客户端的连接后,解除阻塞
s--服务器SOCKET句柄
addr--用来保存客户端地址信息的结构体
addrlen--保存客户端地址信息的结构体变量的大小
返回值--成功返回代表客户端的SOCKET句柄,失败返回INVALID_SOCKET

1.7 发送数据

int send(SOCKET s,const char* buf,int len,int flags);
s--客户端的SOCKET句柄
buf--发送的buffer
len--上述buffer的长度
flags--传输数据时用到的多种选项信息
返回值--成功返回实际传送的字节数,失败返回SOCKET_ERROR

1.8 关闭SOCKET

int closesocket(SOCKET s);
s-SOCKET句柄
返回值--成功返回0,失败返回socket_ERROR

1.9 注销Winsock相关库

int WSACleanup();

返回值--成功返回0,失败返回SOCKET_ERROR

示例代码:
#include <winsock2.h>
#include <stdio.h>
#include "stdlib.h"
void error_handling(char* message);
int main(int argc,char* argv[])
{WSADATA wsaData;SOCKET hSeverSock,hClntSock;SOCKADDR_IN servAddr,clntAddr;int szClntAddr;char Message[]="Hello World";if(argc!=2){printf("Usage : %s <port>\n",argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)error_handling("WSAStartup error");hSeverSock=socket(PF_INET,SOCK_STREAM,0);if(hSeverSock==INVALID_SOCKET)error_handling("socket error");memset(&servAddr,0,sizeof(servAddr));servAddr.sin_family=AF_INET;servAddr.sin_addr.s_addr=htonl(INADDR_ANY);servAddr.sin_port=htons(atoi(argv[1]));if(bind(hSeverSock,(SOCKADDR*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)error_handling("bind error");if(listen(hSeverSock,5)==SOCKET_ERROR)error_handling("listen error");szClntAddr=sizeof(clntAddr);hClntSock=accept(hSeverSock,(SOCKADDR*)&clntAddr,&szClntAddr);if(hClntSock==INVALID_SOCKET)error_handling("accept error");send(hClntSock,Message,sizeof(Message),0);closesocket(hClntSock);closesocket(hSeverSock);if(WSACleanup()!=0)error_handling("WSACleanup error");getchar();return 0;
}
void error_handling(char* message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

Github位置:

https://github.com/HymanLiuTS/NetDevelopment

克隆本项目:

git clone git@github.com:HymanLiuTS/NetDevelopment.git

获取本文源代码:

git checkout NL03

网络编程(3)—— 基于Windows系统的socket服务器端的编程步骤相关推荐

  1. 虚拟服务器windows硬盘30t,避坑指南:基于Windows系统的NAS通过NFS将硬盘空间共享给Hyper-V黑群晖...

    避坑指南:基于Windows系统的NAS通过NFS将硬盘空间共享给Hyper-V黑群晖 2019-07-08 07:30:00 64点赞 601收藏 91评论 方案选择 首先感谢矿难,性价比超高的蜗牛 ...

  2. eclipse你的主机中的软件中止了一个已建立的连接。_如何备份/恢复一个基于Windows系统的操作面板?...

    说明: 对于基于 Windows 系统面板有两种组态备份的选项,而不必获得 ProTool 或 WinCC flexible 的原程序: A. 使用 ProSave 备份/恢复 B. 使用存储卡备份/ ...

  3. 基因家族的鉴定-基于Windows系统上的HMMER

    文章首发于简书链接(https://www.jianshu.com/p/24e4ad69f3e5),发此备份 基因组的序列提取,详情请看我之前的教程:https://www.jianshu.com/p ...

  4. 基因家族的鉴定-基于windows系统上的本地blast

    文章首发于简书链接(https://www.jianshu.com/p/c876a5636554).发此备份. 基因家族的鉴定-基于windows系统上的本地blast 基因组的序列提取,详情请看我之 ...

  5. 微信公众号抓取 所需环境及部分业务代码(基于windows 系统 和 安卓手机)①

    微信公众号抓取所需环境(基于windows 系统 和 安卓手机) 手机 2.Java 环境 3,安卓环境 4.appium 5.anyprxy 6.python环境7.nodejs PC环境搭建: J ...

  6. 迈德威视工业相机入门( 基于 Windows 系统 + VS2019 + OpenCV 4.x.x )

    迈德威视工业相机入门( 基于 Windows 系统 + VS2019 + OpenCV 4.x.x ) 前言: 一.登录迈德威视官网,下载官方SDK: 二.环境配置,相机显示和参数调整( 基于 VS2 ...

  7. 迈德威视相机调用( 基于 Windows 系统 + VS2017 + OpenCV 3.x.x )

    迈德威视相机调用( 基于 Windows 系统 + VS2017 + OpenCV 3.x.x ) 前言 一.登录迈德威视官网,下载官方SDK 二.代码调用与视频帧处理( 基于 VS2017 .C++ ...

  8. php swoole环境搭建,windows系统php环境安装swoole具体步骤

    Swoole原本不支持在Windows下安装的,所以我们要安装Cygwin来使用.在安装Cygwin下遇到了很多坑,百度经验上的文档不是很全,所以我把自己安装Cygwin和Swoole写下来相当于对自 ...

  9. dos命令行设置网络优先级_替代windows系统下cmd的10款命令行工具

    喜欢用linux系统的或者从事开发编程的朋友可能会经常用到命令行工具,下面会整理一些windows下命令行工具. 1.powershell 系统自带 powershell 它可以说cmd的升级版.补充 ...

最新文章

  1. ASP中关于全局页面的作用 asax文件
  2. Delphi:ClientDataset+TDataSetProvider的数据保存问题
  3. 全面分析 Spring 的编程式事务管理及声明式事务管理--转
  4. 2020年推荐系统工程师炼丹手册RecSys版
  5. C++类实例以及子类在内存中的分配
  6. python Linux系统信息
  7. 反射——类(Class)
  8. 通过JAVA操作SAE上的MY SQL数据库
  9. 基于WinForm的多语言开发之界面加载
  10. 如何在 iPhone 和 iPad 上快速找到合适照片?
  11. 如何透过表象直达本质
  12. magicbook linux系统换w7,荣耀 MagicBook U盘装系统win7教程
  13. mysql复制表的两种方法
  14. 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha
  15. android中小数怎么定义,android 如何保留数据两位小数
  16. 月考分析五年级英语html,五年级英语月考总结
  17. 如何做到四位验证码更简洁的生成?
  18. flink实战--水印(watermark)终极总结
  19. 水墨屏RFID超高频标签|RFID电子纸之组态软件操作说明2
  20. java 关键字6,【JAVA SE基础篇】6.开始前的一些规定以及关键字

热门文章

  1. 数字货币稳健投资的秘诀,RBF或许能告诉你答案
  2. 13,21,24.over
  3. angularJS $watch $timeout 使用心得
  4. Linux服务器生成ssh公钥私钥
  5. Weinre入门手册
  6. 2008年互联网投资指南[转]
  7. android混淆便于以后查看,本文借鉴简书作者——光源
  8. 51nod-1875 丢手绢
  9. 超1000万件!高性能复合材料和金属材料挤出3D打印到底能做什么
  10. 如何使用aframe.js构建一个简单的VR播放器