zoukankan      html  css  js  c++  java
  • Linux C/C++ TCP Socket通信实例

    环境:Linux

    语言:C/C++

    通信方式:TCP

      下面用TCP协议编写一个简单的服务器、客户端,其中服务器端一直监听本机的6666号端口。如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。

    server.cpp

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<errno.h>
     5 #include<sys/types.h>
     6 #include<sys/socket.h>
     7 #include<netinet/in.h>
     8 #include<unistd.h>
     9 
    10 #define MAXLINE 4096
    11 
    12 int main(int argc, char** argv){
    13     int  listenfd, connfd;
    14     struct sockaddr_in  servaddr;
    15     char  buff[4096];
    16     int  n;
    17 
    18     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    19         printf("create socket error: %s(errno: %d)
    ",strerror(errno),errno);
    20         return 0;
    21     }
    22 
    23     memset(&servaddr, 0, sizeof(servaddr));
    24     servaddr.sin_family = AF_INET;
    25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    26     servaddr.sin_port = htons(6666);
    27 
    28     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    29         printf("bind socket error: %s(errno: %d)
    ",strerror(errno),errno);
    30         return 0;
    31     }
    32 
    33     if( listen(listenfd, 10) == -1){
    34         printf("listen socket error: %s(errno: %d)
    ",strerror(errno),errno);
    35         return 0;
    36     }
    37 
    38     printf("======waiting for client's request======
    ");
    39     while(1){
    40         if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
    41             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
    42             continue;
    43         }
    44         n = recv(connfd, buff, MAXLINE, 0);
    45         buff[n] = '';
    46         printf("recv msg from client: %s
    ", buff);
    47         close(connfd);
    48     }
    49     close(listenfd);
    50     return 0;
    51 }

     client.cpp

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<errno.h>
     5 #include<sys/types.h>
     6 #include<sys/socket.h>
     7 #include<netinet/in.h>
     8 #include<arpa/inet.h>
     9 #include<unistd.h>
    10 #define MAXLINE 4096
    11 
    12 int main(int argc, char** argv){
    13     int   sockfd, n;
    14     char  recvline[4096], sendline[4096];
    15     struct sockaddr_in  servaddr;
    16 
    17     if( argc != 2){
    18         printf("usage: ./client <ipaddress>
    ");
    19         return 0;
    20     }
    21 
    22     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    23         printf("create socket error: %s(errno: %d)
    ", strerror(errno),errno);
    24         return 0;
    25     }
    26 
    27     memset(&servaddr, 0, sizeof(servaddr));
    28     servaddr.sin_family = AF_INET;
    29     servaddr.sin_port = htons(6666);
    30     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
    31         printf("inet_pton error for %s
    ",argv[1]);
    32         return 0;
    33     }
    34 
    35     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
    36         printf("connect error: %s(errno: %d)
    ",strerror(errno),errno);
    37         return 0;
    38     }
    39 
    40     printf("send msg to server: 
    ");
    41     fgets(sendline, 4096, stdin);
    42     if( send(sockfd, sendline, strlen(sendline), 0) < 0){
    43         printf("send msg error: %s(errno: %d)
    ", strerror(errno), errno);
    44         return 0;
    45     }
    46     close(sockfd);
    47     return 0;
    48 }

    makefile

     1 all:server client
     2 server:server.o
     3     g++ -g -o server server.o
     4 client:client.o
     5     g++ -g -o client client.o
     6 server.o:server.cpp
     7     g++ -g -c server.cpp
     8 client.o:client.cpp
     9     g++ -g -c client.cpp
    10 clean:all
    11     rm all

       执行make命令后,生成server和client两个可执行文件。分别打开两个终端窗口,一个执行./server命令,一个执行./client 127.0.0.1命令,表示连上本机的6666端口,执行./server命令的要先执行。执行./client 127.0.0.1命令后,会提示说要发给server的内容,输入“hello”后,client客户端执行完毕,这时可以看到server的那个终端窗口输出“recv msg from client: hello”。继续执行./client 127.0.0.1命令后,再输入“haha”,server的终端继续输出“recv msg from client: haha”。结果如图所示。

    TCP协议通信交互流程:

        

    参考文献:

    《后台开发:核心技术与应用实践》第六章,p206

  • 相关阅读:
    简单工厂设计模式-模拟磁盘打开文件
    使用GDI绘制验证码
    nginx笔记.
    git 笔记
    ubuntu错误解决。
    测试那些事儿—简述CPU的工作原理
    田螺便利店—win10专业版激活码
    田螺便利店—PyCharm安装第三方库
    田螺便利店—命令提示符总是提示不是内部外部命令
    田螺便利店—ipconfig命令不是内部命令或外部命令怎么解决?
  • 原文地址:https://www.cnblogs.com/zkfopen/p/9441264.html
Copyright © 2011-2022 走看看