devc编译器中的socket编程爬坑日记
Devc下socket编程注意事项
1.需要在【工具T】->【编译选项C】->【编译器】中勾选编译时加入以下命令,然后在输入框中输入-lwsock32,确定后关闭该窗口,(否则运行程序时会出现很多函数未定义的编译错误),步骤如下截图所示:
2.不需要在代码中添加#pragma comment(lib,“ws2_32.lib”)语句也能正常运行源文件!
我的简单socket学习demo
server.c
#include<stdio.h>
#include<winsock.h>
int main()
{//=======================定义变量=======================//char sendBuffer[100]; //发送数据的缓冲区char receiveBuffer[100]; //接收数据的缓冲区int sendLength; //发送数据的长度int receiveLength; //接收数据的长度int length; //表示SOCKADDR的大小SOCKET socketServer; //服务器套接字SOCKET socketClient; //客户端的连接套接字SOCKADDR_IN serverAddress; //服务器地址SOCKADDR_IN clientAddress; //客户端地址WORD wVersonRequested; //字(word):unsigned shortWSADATA wsaData; //库版本信息结构int error; //表示错误//====================初始化套接字库====================//wVersonRequested=MAKEWORD(2,2); //定义版本类型,将两个字节组合成一个字,前面是低字节,后面是高字节error=WSAStartup(wVersonRequested,&wsaData); //加载套接字库,初始化ws2_32.dll动态链接库 if(error!=0){printf("加载套接字库失败!\n");return 0; //程序结束 }if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup(); //不符合 return 0; //程序结束 }//=====================设置连接地址=====================//serverAddress.sin_family=AF_INET; //地址家族,对于必须是AF_INET,注意只有它不是网络字节顺序serverAddress.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //主机地址serverAddress.sin_port=htons(5050); //端口号//===================创建服务器套接字===================// socketServer=socket(AF_INET,SOCK_STREAM,0); //AF_INET表示地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议//===========绑定套接字到本地某个地址和端口上===========// /*socketServer为套接字,(SOCKADDR*)&serverAddress为服务器地址*/ if(bind(socketServer,(SOCKADDR*)&serverAddress,sizeof(SOCKADDR))==SOCKET_ERROR){printf("绑定失败!\n");}else{printf("绑定成功地址端口!\n"); } //=================设置套接字为监听状态=================// if(listen(socketServer,10)<0) //监听状态,为连接做准备,最大等待的数目为10 {printf("监听失败!\n"); }else{printf("正在监听...\n"); } //=======================接收连接=======================//length=sizeof(SOCKADDR);/*接收客户端的发送请求,等待客户端的连接请求*/socketClient=accept(socketServer,(SOCKADDR*)&clientAddress,&length);if(socketClient==SOCKET_ERROR){printf("接收连接失败!\n");}//=======================进行聊天=======================//while(1) //无限循环 { /*接收数据*/receiveLength=recv(socketClient,receiveBuffer,100,0);if(receiveLength<0){printf("接收失败!\n");printf("程序退出!\n");break;}else{printf("客户端 : %s\n",receiveBuffer); //显示客户端发送的数据 }/*发送数据*/printf("请输入消息:");gets(sendBuffer);
// scanf("%s",sendBuffer);sendLength=send(socketClient,sendBuffer,100,0); if(sendLength<0){printf("发送失败!\n");}else{printf("发送成功!\n"); }}//==============释放套接字,关闭动态库==============//closesocket(socketClient); //关闭客户端的套接字资源 closesocket(socketServer); //关闭服务器的套接字资源 WSACleanup(); //关闭动态链接库 return 0;
}
client.c
#include<stdio.h>
#include<winsock.h>int main()
{//=======================定义变量=======================//char sendBuffer[100]; //发送数据的缓冲区char receiveBuffer[100]; //接收数据的缓冲区int sendLength; //发送数据的长度int receiveLength; //接收数据的长度SOCKET socketClient; //客户端的连接套接字SOCKADDR_IN serverAddress; //服务器地址信息结构WORD wVersonRequested; //字(word):unsigned shortWSADATA wsaData; //库版本信息结构int error; //表示错误//====================初始化套接字库====================//wVersonRequested=MAKEWORD(2,2); //定义版本类型,将两个字节组合成一个字,前面是低字节,后面是高字节error=WSAStartup(wVersonRequested,&wsaData); //加载套接字库,初始化ws2_32.dll动态链接库 if(error!=0){printf("加载套接字库失败!\n");return 0; //程序结束 }if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup(); //不符合 return 0; //程序结束 }//=====================设置连接地址=====================//serverAddress.sin_family=AF_INET; //地址家族,对于必须是AF_INET,注意只有它不是网络字节顺序serverAddress.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //主机地址serverAddress.sin_port=htons(5050); //端口号 //=====================连接到服务器=====================//socketClient=socket(AF_INET,SOCK_STREAM,0); //客户端创建套接字,但是不需要绑定,只需要和服务端建立连接就可以了/*进行连接服务器*/if(connect(socketClient,(SOCKADDR*)&serverAddress,sizeof(SOCKADDR))==SOCKET_ERROR){printf("连接失败!\n"); return -1;} else{printf("连接成功!\n");}//=======================进行聊天=======================//while(1){/*发送数据*/printf("输入要发送的数据:");gets(sendBuffer);
// scanf("%s",sendBuffer);sendLength=send(socketClient,sendBuffer,100,0); //发送数据if(sendLength<0){printf("发送失败!\n"); } else{printf("发送成功!\n"); }/*接收数据*/receiveLength=recv(socketClient,receiveBuffer,100,0);if(receiveLength<0){printf("接收失败!\n");printf("程序结束!\n");break;}else{printf("服务端:%s\n",receiveBuffer);}}//==============释放套接字,关闭动态库==============//closesocket(socketClient); //关闭客户端的套接字资源 WSACleanup(); //关闭动态链接库 return 0;
}
demo运行结果
首先运行server.c
接下来运行client.c
客户端向服务器发送一句问候
此时服务端接收消息
服务器发送一句消息给客户端
客户端接收结果
爬坑日记
别看描述这么简单,博主可是因为WSAStartup等函数未定义查了一下午资料,经过种种实验才得出这个结论,故作此文以作纪念。码农路漫漫,且行且。。。
devc编译器中的socket编程爬坑日记相关推荐
- asp.core api 通过socket和服务器通信发送udp_读懂Java中的Socket编程
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- 读懂Java中的Socket编程
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- kali2021.1安装pdtools挤牙膏式爬坑日记
kali2021.1安装pdtools挤牙膏式爬坑日记 本人电脑为macOS Big Sur 11.1 parallels Desktop为16.1.1 首先,感谢两位大佬的博客,由于我出现的问题比较 ...
- cocos 菜鸟爬坑日记
cocos 菜鸟爬坑日记01 1.window全局变量很好用,但是工程复杂了之后容易出现混乱,需要统一管理:(例如用一个专门的data.js来管理所有的全局变量) 2.数据层和逻辑层分开之后,代码会更 ...
- everpano1.3.4爬坑日记
everpano1.3.4爬坑日记 在使用这个版本的时候,切记文件夹命名不要太过复杂,英文字母就好,以免出现字符不符合everpano1.3.4规范.导致切片失败.如需要部署到虚拟机上,则等到项目在本 ...
- silverlight中的socket编程注意事项
1.粘包 目前sl中的socket只能用tcp/ip协议,而tcp/ip本质是一个"流"协议,也就是说数据无边界,发送的就是一连串的字节(没有数据包的概念),因此连续发送时有所谓的 ...
- Go中的Socket编程
在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和W ...
- c++ socket编程_C/C++中的Socket编程
什么是socket编程? Socket编程是将网络上的两个节点连接起来相互通信的一种方式.一个套接字(节点)侦听IP上的特定端口,而另一个套接字与另一个套接字连接.服务器形成侦听器套接字,而客户端可以 ...
- Linux中的socket编程
目录 0.前言 1.Linux中socket编程接口详解 1.1.socket函数 1.2.bind函数 为什么addr参数要使用sockaddr_in 结构体,然后再强制转换为 sockaddr 类 ...
- 在QT中使用socket编程:解决connect函数名称冲突
问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...
最新文章
- 李飞飞下半年或将从 Google离职?李飞飞回应
- Hql 中 dao 层 以及daoimpl 层的代码,让mvc 模式更直观简洁
- 安卓入门系列-05常见布局之RelaiveLayout(相对布局)
- 一键截图_教你一键为iPhone截图加上手机外壳,新技能快学起来!
- python修炼第四天
- Dungeon Master——BFS
- 查找算法——折半查找(JAVA)
- linux服务器之间做ssh,Linux 服务器之间怎么样 SSH 不需密码
- 2021年NBA季后赛第三轮晋级预测
- linux判断字符串命令行,bash – 将命令行参数与字符串进行比较
- ROSTCM6情感分析结果乱码
- index.jsp中文乱码问题
- python开发ps插件_【UI/UE】22款设计师必备的PS插件【附教程】
- 青少年重度抑郁的动态功能连接:与严重程度和症状维度的关系
- banner图如何放置
- Python基础入门知识(2)
- 深度学习中的遥感影像数据集~持续更新
- 网络视频和移动营销 一根绳子上的蚂蚱
- 虚拟机的网络改为桥接网络
- sap 新手入门第一课(新装SAP IDES必须做的操作)
热门文章
- 安装 tensorflow 环境
- C++11多线程std::thread的简单使用
- Linux系统GCC常用命令和GCC编译过程描述
- 框架学习笔记:Unity3D的MVC框架——StrangeIoC
- c# 导出Excel
- C# 类2010-11-07
- 求1+2+3+...+n(剑指 Offer 64)
- 替换空格python实现
- cvPyrUp() cvPyrDown() 图像金字塔
- sprint() 和 snprint()