C++中Socket网络编程实例详解

 更新时间:2017年04月08日 16:24:40   投稿:lqh  
这篇文章主要介绍了C++中Socket网络编程实例详解的相关资料,需要的朋友可以参考下

C++中Socket网络编程实例详解

现在几乎所有C/C++的后台程序都需要进行网络通讯,其实现方法无非有两种:使用系统底层socket或者使用已有的封装好的网络库。本文对两种方式进行总结,并介绍一个轻量级的网络通讯库ZeroMQ。

 1.基本的Scoket编程

关于基本的scoket编程网络上已有很多资料,作者在这里引用一篇文章中的内容进行简要说明。

基于socket编程,基本上就是以下6个步骤:

1、socket()函数
2、bind()函数
3、listen()、connect()函数
4、accept()函数
5、read()、write()函数等
6、close()函数

下面直接引用文章里的代码说明。

//服务器端  
    
  #include<stdio.h>  
  #include<stdlib.h>  
  #include<string.h>  
  #include<errno.h>  
  #include<sys/types.h>  
  #include<sys/socket.h>  
  #include<netinet/in.h>  
    
  #define MAXLINE 4096  
    
  int main(int argc, char** argv)  
  {  
    int  listenfd, connfd;  
    struct sockaddr_in   servaddr;  
    char  buff[4096];  
    int   n;  
    
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
    servaddr.sin_port = htons(6666);  
    
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){  
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    
    if( listen(listenfd, 10) == -1){  
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    
    printf("======waiting for client's request======\n");  
    while(1){  
    if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){  
      printf("accept socket error: %s(errno: %d)",strerror(errno),errno);  
      continue;  
    }  
    n = recv(connfd, buff, MAXLINE, 0);  
    buff[n] = '\0';  
    printf("recv msg from client: %s\n", buff);  
    close(connfd);  
    }  
    
    close(listenfd);  
  }
客户端  
    
  #include<stdio.h>  
  #include<stdlib.h>  
  #include<string.h>  
  #include<errno.h>  
  #include<sys/types.h>  
  #include<sys/socket.h>  
  #include<netinet/in.h>  
    
  #define MAXLINE 4096  
    
  int main(int argc, char** argv)  
  {  
    int  sockfd, n;  
    char  recvline[4096], sendline[4096];  
    struct sockaddr_in  servaddr;  
    
    if( argc != 2){  
    printf("usage: ./client <ipaddress>\n");  
    exit(0);  
    }  
    
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){  
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);  
    exit(0);  
    }  
    
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_port = htons(6666);  
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){  
    printf("inet_pton error for %s\n",argv[1]);  
    exit(0);  
    }  
    
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){  
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    
    printf("send msg to server: \n");  
    fgets(sendline, 4096, stdin);  
    if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
    {  
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
    exit(0);  
    }  
    
    close(sockfd);  
    exit(0);  
  }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C语言中循环嵌套的应用方式

    C语言中循环嵌套的应用方式

    这篇文章主要介绍了C语言中循环嵌套的应用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++ LeetCode542矩阵示例详解

    C++ LeetCode542矩阵示例详解

    这篇文章主要为大家介绍了C++ LeetCode542矩阵示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++设计模式之桥接模式

    C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式、为什么要使用桥接模式、什么时候使用桥接模式等内容,需要的朋友可以参考下
    2014-09-09
  • C语言算法积累图的遍历邻接表简单路径

    C语言算法积累图的遍历邻接表简单路径

    这篇文章主要为大家介绍了C语言算法积累图的遍历邻接表简单路径实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • C++数据结构分析多态的实现与原理及抽象类

    C++数据结构分析多态的实现与原理及抽象类

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-02-02
  • C++数位DP复杂度统计数字问题示例详解

    C++数位DP复杂度统计数字问题示例详解

    这篇文章主要为大家介绍了利用C++数位DP的复杂度来统计数字问题的示例实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升值加薪
    2021-11-11
  • 详解C++编程中的单目运算符重载与双目运算符重载

    详解C++编程中的单目运算符重载与双目运算符重载

    这篇文章主要介绍了详解C++编程中的单目运算符重载与双目运算符重载,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言指针的图文详解

    C语言指针的图文详解

    这篇文章主要为大家介绍了C语言指针,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C++用Dijkstra(迪杰斯特拉)算法求最短路径

    C++用Dijkstra(迪杰斯特拉)算法求最短路径

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。下面这篇文章就给大家介绍关于C++用Dijkstra算法(迪杰斯特拉算法)求最短路径的方法,下面来一起看看吧。
    2016-12-12
  • C语言实现数独游戏

    C语言实现数独游戏

    这篇文章主要为大家详细介绍了C语言实现数独游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论