第一次用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. // client.cpp
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <Winsock2.h>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11. // 加载socket动态链接库(dll)
  12. WORD wVersionRequested;
  13. WSADATA wsaData; // 这结构是用于接收Wjndows Socket的结构信息的
  14. int err;
  15.  
  16. wVersionRequested = MAKEWORD( , ); // 请求1.1版本的WinSock库
  17.  
  18. err = WSAStartup( wVersionRequested, &wsaData );
  19. if ( err != ) {
  20. return -; // 返回值为零的时候是表示成功申请WSAStartup
  21. }
  22.  
  23. if ( LOBYTE( wsaData.wVersion ) != || HIBYTE( wsaData.wVersion ) != ) {
  24. // 检查这个低字节是不是1,高字节是不是1以确定是否我们所请求的1.1版本
  25. // 否则的话,调用WSACleanup()清除信息,结束函数
  26. WSACleanup( );
  27. return -;
  28. }
  29.  
  30. // 创建socket操作,建立流式套接字,返回套接字号sockClient
  31. // SOCKET socket(int af, int type, int protocol);
  32. // 第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)
  33. // 第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)
  34. SOCKET sockClient = socket(AF_INET, SOCK_STREAM, );
  35.  
  36. // 将套接字sockClient与远程主机相连
  37. // int connect( SOCKET s, const struct sockaddr* name, int namelen);
  38. // 第一个参数:需要进行连接操作的套接字
  39. // 第二个参数:设定所需要连接的地址信息
  40. // 第三个参数:地址的长度
  41. SOCKADDR_IN addrSrv;
  42. addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 本地回路地址是127.0.0.1;
  43. addrSrv.sin_family = AF_INET;
  44. addrSrv.sin_port = htons();
  45. connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
  46.  
  47. char recvBuf[];
  48. recv(sockClient, recvBuf, , );
  49. printf("%s\n", recvBuf);
  50.  
  51. send(sockClient, "Attention: A Client has enter...\n", strlen("Attention: A Client has enter...\n")+, );
  52.  
  53. printf("我们可以聊五句话");
  54. int n = ;
  55. do{
  56. printf("\n还剩%d次:", n);
  57. char talk[];
  58. printf("\nPlease enter what you want to say next(\"quit\"to exit):");
  59. gets(talk);
  60. send(sockClient, talk, strlen(talk)+, ); // 发送信息
  61.  
  62. char recvBuf[];
  63. recv(sockClient, recvBuf, , );
  64. printf("%s Says: %s\n", "Server", recvBuf); // 接收信息
  65. }while(--n);
  66.  
  67. printf("End linking...\n");
  68. closesocket(sockClient);
  69. WSACleanup(); // 终止对套接字库的使用
  70.  
  71. printf("\n");
  72. system("pause");
  73. return ;
  74. }

关于超时的处理方法

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

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

windows下是这样写的:
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

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

struct timeval timeout = {3,0};
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));

//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

有两点注意就是:

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

2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。

C++ 网络编程 总结的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  10. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

随机推荐

  1. Solr高效利用:Solr实现SQL的查询与统计

    1.如何高效使用Solr查询功能 ?2.单个字段分组统计如何实现? 3.IN条件查询有几种方式? 4.多个字段分组统计是否只支持count? Cloudera公司已经推出了基于Hadoop平台的查询统 ...

  2. TP5实现邮件发送(PHP 利用QQ邮箱发送邮件「PHPMailer」)

    在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持. 如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮 ...

  3. [十二省联考2019]异或粽子 (可持久化01tire 堆)

    /* 查询异或最大值的方法是前缀和一下, 在01trie上二分 那么我们可以对于n个位置每个地方先求出最大的数, 然后把n个信息扔到堆里, 当我们拿出某个位置的信息时, 将他去除当前最大后最大的信息插 ...

  4. 零基础学习python_with(34课)

    今天学习的with语句,with的表达形式如下:据说context必须是上下文管理器,这我就懵比了,啥玩意啊... with语句的表达形式: with context as var:    block ...

  5. [Unity算法]A星寻路(一):基础版本

    参考链接: https://www.cnblogs.com/yangyxd/articles/5447889.html 一.原理 1.将场景简化,分割为一个个正方形格子,这些格子称之为节点(node) ...

  6. ElasticSearch 2 (1) - Getting Start

    ElasticSearch 2.1.1 (1) - Getting Start Install & Up cd elasticsearch-2.1.1/bin ./elasticsearch ...

  7. UVA-10020-贪心

    题意:给你一些数轴上的线段,要求寻找出某些线段能够完全覆盖[0,M],并且取的线段数目最小. 解题思路: 贪心思路, 1.每个线段都有一个L和R,代表它的起点和终点,对于所有R <= 0 ,   ...

  8. uva-10132-排序

    题意: 有很多文件,碎成了俩片,问,原来的文件是什么,如果有多个答案,任意一个答案就行,输入2N个字符串,拼接成N个文件. 直接排序,正确的答案一定是某个长度最短的和某个最长的连在一起. #inclu ...

  9. apache伪静态规则解析

    apache伪静态规则解析 最近有个客户有个要求,昨天折腾了一会,没解决,今天没啥就多学习学习 还是根据例子来学习比较快 1 简单的重定向规则 RewriteEngine On //启动规则 Rewr ...

  10. python入门-python处理csv文件格式相关

    python入门-python处理csv文件格式相关 处理 下载的csv格式文件 直接上代码和效果图 import csv from datetime import datetime from mat ...