首页 > 编程 > C++ > 正文

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

2020-05-23 13:47:43
字体:
来源:转载
供稿:网友

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表