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编程爬坑日记相关推荐

  1. asp.core api 通过socket和服务器通信发送udp_读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  2. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  3. kali2021.1安装pdtools挤牙膏式爬坑日记

    kali2021.1安装pdtools挤牙膏式爬坑日记 本人电脑为macOS Big Sur 11.1 parallels Desktop为16.1.1 首先,感谢两位大佬的博客,由于我出现的问题比较 ...

  4. cocos 菜鸟爬坑日记

    cocos 菜鸟爬坑日记01 1.window全局变量很好用,但是工程复杂了之后容易出现混乱,需要统一管理:(例如用一个专门的data.js来管理所有的全局变量) 2.数据层和逻辑层分开之后,代码会更 ...

  5. everpano1.3.4爬坑日记

    everpano1.3.4爬坑日记 在使用这个版本的时候,切记文件夹命名不要太过复杂,英文字母就好,以免出现字符不符合everpano1.3.4规范.导致切片失败.如需要部署到虚拟机上,则等到项目在本 ...

  6. silverlight中的socket编程注意事项

    1.粘包 目前sl中的socket只能用tcp/ip协议,而tcp/ip本质是一个"流"协议,也就是说数据无边界,发送的就是一连串的字节(没有数据包的概念),因此连续发送时有所谓的 ...

  7. Go中的Socket编程

    在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和W ...

  8. c++ socket编程_C/C++中的Socket编程

    什么是socket编程? Socket编程是将网络上的两个节点连接起来相互通信的一种方式.一个套接字(节点)侦听IP上的特定端口,而另一个套接字与另一个套接字连接.服务器形成侦听器套接字,而客户端可以 ...

  9. Linux中的socket编程

    目录 0.前言 1.Linux中socket编程接口详解 1.1.socket函数 1.2.bind函数 为什么addr参数要使用sockaddr_in 结构体,然后再强制转换为 sockaddr 类 ...

  10. 在QT中使用socket编程:解决connect函数名称冲突

    问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...

最新文章

  1. 李飞飞下半年或将从 Google离职?李飞飞回应
  2. Hql 中 dao 层 以及daoimpl 层的代码,让mvc 模式更直观简洁
  3. 安卓入门系列-05常见布局之RelaiveLayout(相对布局)
  4. 一键截图_教你一键为iPhone截图加上手机外壳,新技能快学起来!
  5. python修炼第四天
  6. Dungeon Master——BFS
  7. 查找算法——折半查找(JAVA)
  8. linux服务器之间做ssh,Linux 服务器之间怎么样 SSH 不需密码
  9. 2021年NBA季后赛第三轮晋级预测
  10. linux判断字符串命令行,bash – 将命令行参数与字符串进行比较
  11. ROSTCM6情感分析结果乱码
  12. index.jsp中文乱码问题
  13. python开发ps插件_【UI/UE】22款设计师必备的PS插件【附教程】
  14. 青少年重度抑郁的动态功能连接:与严重程度和症状维度的关系
  15. banner图如何放置
  16. Python基础入门知识(2)
  17. 深度学习中的遥感影像数据集~持续更新
  18. 网络视频和移动营销 一根绳子上的蚂蚱
  19. 虚拟机的网络改为桥接网络
  20. sap 新手入门第一课(新装SAP IDES必须做的操作)

热门文章

  1. 安装 tensorflow 环境
  2. C++11多线程std::thread的简单使用
  3. Linux系统GCC常用命令和GCC编译过程描述
  4. 框架学习笔记:Unity3D的MVC框架——StrangeIoC
  5. c# 导出Excel
  6. C# 类2010-11-07
  7. 求1+2+3+...+n(剑指 Offer 64)
  8. 替换空格python实现
  9. cvPyrUp() cvPyrDown() 图像金字塔
  10. sprint() 和 snprint()