当前位置: 首页 > news >正文

C++ 网络编程 总结

第一次用C++写程序,对C++ 只是菜鸟级别的,倒是对C#很熟悉。两者有很大的相似性。但也有不同。

首先写了一个网络通讯用的小的MFC程序。发现

(1)MFC写界面真的好麻烦呀。用C#写的tab 分分钟搞定的事,用C++害得我写了两天.关键是不熟练. 还有list control 控件的图标显示. 真是很麻烦

不过,由于最后的 detch() 函数执行后,就真正显示出来了.这些具体的小细节,一般在 书上都没有写.

(2)用C++ 写类的特征,基本上与C#是相似的.

说一下网络编程的问题吧

1\一开始并不清楚 C++ 写程序用的网络套接字,三类的不一样的地方.总以为我用的VS2013,用最高级别的套接字应该更容易一些,于是选用了CSOCKET 结果由于这个套接字是阻塞模式,结果被卡住了,卡住不知道如何做了.如果对方设备没有反应,最不能死等吧,这样不行.

于上网上搜索,发现一篇文章写到 给 CSocket 加上超时.于时照抄照搬着做了一遍,可惜失败了. 怎么查也查不出原因. 按原文章一字一句的比较,也没有找出原因来.失败换思路

2\想到低一点的 CAsyncSocket 是异步操作的.这样总可以了吧不会阻塞了吧.但是回调函数使得处理起来也不方便.在什么时候做处理,就需要消息做处理.但是也很麻烦.

3\于是,找出书来,大部分书上对于网络部分只是介绍了一个最基本的 Socket ,看起来也挺简单的. 就先试一下这个最基本的吧.

没想到 30分钟后,网络程序测试成功. 而且有超时接收,超时发送,等.正合我意.

原来最基本的,才是最好的.

总结一下:

SOCKET的操作方法

以下是一个网络客户端的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

// client.cpp

#include <iostream>

#include <cstdio>

#include <Winsock2.h>

usingnamespacestd;

intmain()

{

// 加载socket动态链接库(dll)

WORDwVersionRequested;

WSADATA wsaData;// 这结构是用于接收Wjndows Socket的结构信息的

interr;

wVersionRequested = MAKEWORD( 1, 1 );// 请求1.1版本的WinSock库

err = WSAStartup( wVersionRequested, &wsaData );

if( err != 0 ) {

return-1;// 返回值为零的时候是表示成功申请WSAStartup

}

if( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {

// 检查这个低字节是不是1,高字节是不是1以确定是否我们所请求的1.1版本

// 否则的话,调用WSACleanup()清除信息,结束函数

WSACleanup( );

return-1;

}

// 创建socket操作,建立流式套接字,返回套接字号sockClient

// SOCKET socket(int af, int type, int protocol);

// 第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)

// 第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)

SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

// 将套接字sockClient与远程主机相连

// int connect( SOCKET s, const struct sockaddr* name, int namelen);

// 第一个参数:需要进行连接操作的套接字

// 第二个参数:设定所需要连接的地址信息

// 第三个参数:地址的长度

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// 本地回路地址是127.0.0.1;

addrSrv.sin_family = AF_INET;

addrSrv.sin_port = htons(6000);

connect(sockClient, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

charrecvBuf[100];

recv(sockClient, recvBuf, 100, 0);

printf("%s\n", recvBuf);

send(sockClient,"Attention: A Client has enter...\n",strlen("Attention: A Client has enter...\n")+1, 0);

printf("我们可以聊五句话");

intn = 5;

do{

printf("\n还剩%d次:", n);

chartalk[100];

printf("\nPlease enter what you want to say next(\"quit\"to exit):");

gets(talk);

send(sockClient, talk,strlen(talk)+1, 0);// 发送信息

charrecvBuf[100];

recv(sockClient, recvBuf, 100, 0);

printf("%s Says: %s\n","Server", recvBuf);// 接收信息

}while(--n);

printf("End linking...\n");

closesocket(sockClient);

WSACleanup();// 终止对套接字库的使用

printf("\n");

system("pause");

return0;

}

关于超时的处理方法

在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:

在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,

在windows下是这样写的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

intnNetTimeout=1000;//1秒,

//设置发送超时

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&nNetTimeout,sizeof(int));

//设置接收超时

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&nNetTimeout,sizeof(int));

这样做在Linux环境下是不会产生效果的,须如下定义:

structtimeval timeout = {3,0};

//设置发送超时

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(structtimeval));

//设置接收超时

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(structtimeval));

有两点注意就是:

1)recv ()的第四个参数需为MSG_WAITALL(设置MSG_DONTWAIT可以不用阻塞在建立连接后在等等接收数据),在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。

http://www.jsqmd.com/news/716550/

相关文章:

  • 若依RuoYi-Vue-Plus×95coder:一句话生成客户管理全链路,AI重构后台开发范式
  • Win11Debloat终极指南:三步解决Windows臃肿问题,让你的电脑重获新生
  • 2026年现阶段:成都几字型钢采购如何考察厂商综合实力? - 2026年企业推荐榜
  • 备战蓝桥杯国赛【day2】
  • 手把手教你:基于Intel Agilex 5 E系列FPGA搭建一个边缘AI推理原型(含资源评估)
  • 2026年现阶段武汉休学辍学干预机构深度解析:为何纽特心理成为专业之选? - 2026年企业推荐榜
  • Stable Diffusion加速神器:用DDIM采样算法,让你的AI绘画速度提升10倍(附PyTorch代码)
  • 别再瞎调RAG了!用Ragas框架给你的AI应用做个‘体检’,实测效果提升30%
  • BackupPC数据恢复实战:误删服务器/demo目录后,我是如何用3种恢复方式找回文件的
  • 哪家25-30万家用SUV车型专业?2026年4月推荐评测口碑对比五款产品顶尖亲子出行舒适性差 - 品牌推荐
  • 5步掌握专业缠论分析:ChanlunX通达信插件终极指南
  • 【飞机】飞机的固有频率和模态形状Matlab仿真
  • 如何卸载并重装Oracle Grid_Deinstall脚本与ASM磁盘清理
  • 别只刷题了!用2023年Python省赛真题,手把手教你搭建自己的‘错题本’与复盘系统
  • 直线电机电磁减振系统状态监测【附代码】
  • 告别云干扰!用GEE官方云概率数据集高效处理Sentinel-2影像(附完整代码与避坑指南)
  • Go语言for循环如何写_Go语言for循环语法教程【经典】.txt
  • 3分钟让Windows 11焕然一新:Win11Debloat小白也能懂的终极优化指南
  • 从红蓝对抗视角复盘:OA系统漏洞利用工具V2.0在实战演练中的攻防价值
  • 别再乱装Python全家桶了!手把手教你用Anaconda+Pycharm搞定PyTorch环境(含CUDA配置避坑指南)
  • 2026年Q2安徽甲醇燃料油企业口碑榜揭晓:金立然新能源科技为何脱颖而出? - 2026年企业推荐榜
  • 别再手动合并Excel了!用EasyExcel的CustomMergeStrategy,5分钟搞定报表美化
  • SVPWM七段式Verilog实现避坑指南:死区时间与电压量化那些事儿
  • 2026年北京少儿嘻哈舞培训指南:聚焦舞台实践,这家机构值得关注 - 2026年企业推荐榜
  • 别再只会用top看CPU了!手把手教你用stress-ng在Linux上模拟真实业务压力
  • 2026年现阶段住宅装修设计市场:如何选择靠谱服务商并获取联系方式? - 2026年企业推荐榜
  • 【优化位置】基于粒子群算法的配电系统中电容的最佳位置(降低损耗和电压改善)附Matlab代码
  • 从SSD到CXL:聊聊那些让十亿向量搜索跑得更快的‘近’存储黑科技
  • 金融与游戏App安全加固怎么做?2026年行业定制化方案深度解析
  • TVA在PCB线路板制造与检测中的创新应用(11)