C++ 网络编程 总结_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的操作方法

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

// client.cpp 

#include <iostream>
#include <cstdio>
#include <Winsock2.h> 

using namespace std; 

int main()
{
// 加载socket动态链接库(dll)
  WORD wVersionRequested;
  WSADATA wsaData;  // 这结构是用于接收Wjndows Socket的结构信息的
  int err; 

  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)); 

  char recvBuf[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("我们可以聊五句话");
  int n = 5;
  do{
    printf("\n还剩%d次:", n);
    char talk[100];
    printf("\nPlease enter what you want to say next(\"quit\"to exit):");
    gets(talk);
    send(sockClient, talk, strlen(talk)+1, 0);     // 发送信息 

    char recvBuf[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");
  return 0;
}

关于超时的处理方法

在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++
网络编程
c语言编程总结、c语言网络编程、c语言socket网络编程、c语言网络编程教程、c语言网络编程实例,以便于您获取更多的相关知识。

时间: 2024-09-02 17:30:29

C++ 网络编程 总结_C 语言的相关文章

linux下基于C语言的信号编程实例_C 语言

本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si

C和C++混合编程问题_C 语言

分析以下一段代码: /*=======sum.h=========*/ #ifndef SUM_H #define SUM_H #include <stdio.h> int sum(int a,int b); #endif; /*=======sum.c=========*/ #include "sum.h" int sum(int a,int b) { int c=a+b; return c; } /*====main.cpp======*/ #include "

网络编程-求教C语言能申请GET或CGI连接后如何获取数据。

问题描述 求教C语言能申请GET或CGI连接后如何获取数据. 本人现在在公司实习中,做的这个方向公司里只有一个人在研究.希望各位大神不吝帮助. 我们现在需要连接一个网络摄像头,用的是LINUX系统的ARM核心的板子.网络摄像头的API只有WINDOWS平台的,LINUX平台下只能通过浏览器的GET或CGI连接在网页中显示视频.该视频为RTP连接.这本来是浏览器的工作,现在要在自己的APP中实现提取视频的数据,之后做相关处理. 请问如何直接用应用程序获得GET或CGI申请后的那个RTP连接? 谢谢

VC程序在Win32环境下动态链接库(DLL)编程原理_C 语言

本文详细讲述了VC程序在Win32环境下动态链接库(DLL)编程原理.分享给大家供大家参考.具体分析如下: 一般比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用.在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费:另一个缺点是

ipv6实现udp编程示例_C 语言

开发测试环境:WIN7SP1.VS2005 UdpServer.cpp 复制代码 代码如下: #include <iostream>#include <WinSock2.h>#include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") int main(int argc, char** argv){ using namespace std;  cout<<"Server Sta

ipv6实现tcp编程示例_C 语言

开发测试环境:WIN7SP. VS2005 TcpServer.cpp 复制代码 代码如下: #include <iostream>#include <WinSock2.h>#include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") int main(int argc, char** argv){ using namespace std;  cout<<"Server Sta

C语言中socket相关网络编程函数小结_C 语言

C语言socket()函数:建立一个socket通信头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int socket(int domain, int type, int protocol); 函数说明:socket()用来建立一个新的socket, 也就是向系统注册, 通知系统建立一通信端口. 参数domain 指定使用何种的地址类型, 完整的定义在/usr/include/bits/socket.h 内, 底

用C语言进行最基本的socket编程_C 语言

什么是socket 你经常听到人们谈论着 "socket",或许你还不知道它的确切含义.现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式.什么?你也许听到一些Unix高手(hacker)这样说过:"呀,Unix中的一切就是文件!"那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读或者写一个文件描述符.一个文件描述符只是一个和打开的文件相关联的整数.但是(注意后面的话),

Java编程那些事儿105——网络编程技术4

13.2.4 UDP编程 网络通讯的方式除了TCP方式以外,还有一种实现的方式就是UDP方式.UDP(User Datagram Protocol),中文意思是用户数据报协议,方式类似于发短信息,是一种物美价廉的通讯方式,使用该种方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对于服务器的压力要比TCP小很多,所以也是一种常见的网络编程方式.但是使用该种方式最大的不足是传输不可靠,当然也不是说经常丢失,就像大家发短信息一样,理论上存在收不到的可能,这种可能性可能是1%,反正比较小,但是由