Windows的socket编程
################服务端
1.准备工作导入头文件
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
2.确定版本信息
MSAStartup :异步套接字的启动命令 . 第一个参数是版本请求,高阶字节是修订版本,低阶字节是主版本号
第二个参数是一个结构体,接收socket的实现细节
WSADATA wsaData;
WSAStartup(MAKEWORD(,),&wsaData);
if(LOBYTE(wsaData.wVersion)!= || HIBYTE(wsaData.wVersion)!=)
{
printf("请求版本失败");
return ;
}
3.创建socket
第一个参数表示要使用的协议族 : AF_INET IPv4的地址 和 端口号(16位)的组合
第二个参数表示类型 SOCK_STREAM 流式socket , 面向连接的socket
第三个参数指定协议 IPPROTO_TCP 使用 TCP 传输协议
SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
if(INVALID_SOCKET == severSocket)
{
printf("套接字创建失败");
return ;
}
4.初始化协议地址族
SOCKADDR_IN serverAddr = {}; //初始化协议地址
serverAddr.sin_family = AF_INET;//必须和创建socket的IP协议一致
serverAddr.sin_prot = htons(); //服务器端口,客户端通过这个端口连接
//ip地址是点分格式的字符串 , 用inet_addr来转换整数
serverAddr.sin_addr.S_un.S_addr = inet_addr("172.0.0.1");
5.绑定
if(SOCKET_ERROR == bind(serverSocket , (SOCKADDR*)&serverAddr , sizeof(serverAddr)))
{
printf("绑定失败");
closesocket(serverSocket); //释放socket
WSACleanup(); //关闭套接字
return ;
}
printf("绑定成功");
6.监听
listen的第二个参数是监听的个数 , 等待连接的队列最大长度
if(SOCKET_ERROR == listen(serverSocket, ))
{
printf("监听失败");
closesocket(serverSocket); //释放socket
WSACleanup(); //关闭套接字
return ;
}
printf("监听成功");
7.接受连接
accetp 第二第三个参数可以给NULL 表示不保存连接进来的客户端(ip)信息 , 不给NULL 表示保存客户端信息
SOCKADDR_IN clientAddr = {};
int len = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket,(SOCKADDR*)&clientAddr, &len); //阻塞函数
if(clientSocket == INVALID_SOCKET)
{
printf("连接失败");
closesocket(serverSocket); //释放socket
WSACleanup(); //关闭套接字
return ;
}
printf("连接成功");
printf("客户端(%s)\n" , inet_ntoa(clientAddr.sin_addr));
8.开始通讯
recv的第一个参数表示客户端的socket 进行接收数据 , 第四个参数表示收发方式默认为0, 一次收完
char recvBuff[] = {};
while()
{
memset(recvBuff, , sizeof(recvBuff));
if(recv(clientSocket , recvBuff, sizeof(recvBuff)- , ) >) //阻塞函数
{
printf(">>%s\n" , recvBuff);
}
char sendBuff[] = {};
memset(sendBuff, , sizeof(sendBuff));
printf("请输入:\n");
scanf_s("%s" , sendBuff, sizeof(sendBuff)-);
//一次收发
send(clientSocket , sendBuff, strlen(sendBuff), );
}
9.关闭socket
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
################客户端
1.准备工作导入头文件
2.确定版本信息
MSAStartup :异步套接字的启动命令 . 第一个参数是版本请求,高阶字节是修订版本,低阶字节是主版本号
第二个参数是一个结构体,接收socket的实现细节
3.创建socket
第一个参数表示要使用的协议族 : AF_INET IPv4的地址 和 端口号(16位)的组合
第二个参数表示类型 SOCK_STREAM 流式socket , 面向连接的socket
第三个参数指定协议 IPPROTO_TCP 使用 TCP 传输协议
SOCKET clientSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
if(INVALID_SOCKET == clientSocket)
{
printf("套接字创建失败");
return ;
}
4.初始化协议地址族(初始化的是服务端的ip地址及端口, 表示连接用)
SOCKADDR_IN clientAddr = {}; //初始化协议地址
clientAddr.sin_family = AF_INET;//必须和创建socket的IP协议一致
clientAddr.sin_prot = htons(); //服务器端口,客户端通过这个端口连接
//ip地址是点分格式的字符串 , 用inet_addr来转换整数
clientAddr.sin_addr.S_un.S_addr = inet_addr("172.0.0.1");
5.连接
if(SOCKET_ERROR == connect(clientSocket , (sockaddr *)&clientAddr , sizeof(clientAddr)))
{
printf("连接失败");
closesocket(clientSocket); //释放socket
WSACleanup(); //关闭套接字
return ;
}
printf("连接成功");
8.开始通讯
recv的第一个参数表示客户端的socket 进行接收数据 , 第四个参数表示收发方式默认为0, 一次收完
char sendBuff[] = {};
while()
{
memset(sendBuff, , sizeof(sendBuff));
printf("请输入:\n");
scanf_s("%s" , sendBuff, sizeof(sendBuff)-);
//一次收发
send(clientSocket , sendBuff, strlen(sendBuff), );
char recvBuff[] = {};
memset(recvBuff, , sizeof(recvBuff));
if(recv(clientSocket , recvBuff, sizeof(recvBuff)- , ) >) //阻塞函数
{
printf(">>%s\n" , recvBuff);
}
}
9.关闭socket
closesocket(clientSocket);
WSACleanup();
Windows的socket编程的更多相关文章
- [补] windows C socket编程——大物实验预约
注 : 心血来潮,想着把这两年没能记录下来的经历,写一波回忆杀.诚然,有些经历十分复杂繁琐,希望能耐下性子,写出好文章来,可惜一时不能全想起来这两年来的种种,就想起来什么便写什么吧. 时间估摸着是大一 ...
- 记一次:Windows的Socket编程学习和分析过程
Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...
- windows下socket编程:区分shutdown()及closesocket()
以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...
- windows下socket编程实现client和server双向通信
服务端代码server.c // server.cpp : Defines the entry point for the console application. // #include <s ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- Windows Phone下的Socket编程
讨论下有关于Windows Phone下的Socket编程方面的知识. Socket就是通常所称的套接字,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过Socket向网络发出请求或者应答 ...
- linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...
- 转:socket编程在windows和linux下的区别
如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...
- socket编程在windows和linux下的区别
如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...
随机推荐
- 13-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,IEEE754规约
https://www.cnblogs.com/yangfengwu/p/11100552.html 这节做个上位机控制Wi-Fi引脚输出的PWM占空比信号,灯的亮度就可以用上位机控制了 大家可以自己 ...
- 洛谷 P1522 牛的旅行 Cow Tours 题解
P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...
- 洛谷P2877 [USACO07NOV]防晒霜Sunscreen
题目 此题有多种贪心方法. 首先简化题意: 有几个在数轴上的区间,和几个在数轴上确定的位置的点,问用这些数目的点,最多能满足多少个区间里有点. 注意:此题跟区间选点问题不一样,每个点只能满足一个区间, ...
- HEXO快速搭建自己的博客
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 很多人有自己的博客,那么你想要吗?利用Hexo就可以搭建专属自己 ...
- 意图Intent
意图点击官方链接 前言 对意图Intent,学习安卓需掌握.以官方链接:http://www.android-doc.com/reference/android/content/Intent.html ...
- js constructor typeOf 区别
constructor 属性返回对创建此对象的数组函数的引用. 例如:const obj = {a: 1} console.log(obj.constructor) // funct ...
- CSP-S乱搞记
还有一年的时间,没人能挡住我前进的脚步 以后不打算写游记了,补完这篇再写就等退役吧,不太想传播什么负能量,走这条路,希望能得到自己想要的东西 Day-n 上了一个月文化课,班主任突然催我搞竞赛??? ...
- EasyEarth三维可视化解决方案——智慧林业
智慧林业 智能巡管监护 护林员信息查询 护林员管护范围查询 护林员报警.采集数据查看 样点.样线管理 其它功能模块 ●一键考勤打卡 ●面积测量 ●任务公告发布 ●实时电量监控 ●一键报警功能 ●北斗短 ...
- python3 报错UnicodeEncodeError
在ubuntu执行python3的时候,出现 UnicodeEncodeError: 'latin-1' codec can't encode characters in position 10-18 ...
- element ui 怎么去修改el-date-picker的时间
<el-date-picker v-model="formSearch.timeRange" type="daterange" placeholder=& ...