【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯

本次实验利用TCP/IP, 语言环境为 C/C++

利用套接字Socket编程,实现Server/CLient 之间简单的通讯。

结果应为类似所示:

下面贴上代码(参考参考...)

Server 部分:

  1 /* TCPServer.cpp - main */
  2
  3 #include <stdlib.h>
  4 #include <stdio.h>
  5 #include <winsock2.h>
  6 #include <time.h>
  7 #include "conio.h"
  8
  9 #define QLEN       5
 10 #define    WSVERS    MAKEWORD(2, 0)
 11 #define    BUFLEN        20000
 12 #pragma comment(lib,"ws2_32.lib")  //使用winsock 2.2 library
 13 /*------------------------------------------------------------------------
 14  * main - Iterative TCP server for TIME service
 15  *------------------------------------------------------------------------
 16  */
 17 char buf[20000];
 18 char buf1[20000];
 19 char buf2[20000];
 20 void main(int argc, char *argv[])
 21 /* argc: 命令行参数个数, 例如:C:\> TCPServer 8080
 22                      argc=2 argv[0]="TCPServer",argv[1]="8080" */
 23 {
 24     struct    sockaddr_in fsin;        /* the from address of a client      */
 25     SOCKET    msock, ssock;            /* master & slave sockets          */
 26     WSADATA wsadata;
 27     char    *service = "5050";
 28     struct  sockaddr_in sin;        /* an Internet endpoint address        */
 29     int        alen;                    /* from-address length                */
 30     char    *pts;                    /* pointer to time string            */
 31 //    char pts[2000];
 32     time_t    now;                    /* current time                        */
 33     int cc;
 34
 35     WSAStartup(WSVERS, &wsadata);                        // 加载winsock library。WSVERS指明请求使用的版本。wsadata返回系统实际支持的最高版本
 36     msock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);    // 创建套接字,参数:因特网协议簇(family),流套接字,TCP协议
 37                                                         // 返回:要监听套接字的描述符或INVALID_SOCKET
 38
 39     memset(&sin, 0, sizeof(sin));                        // 从&sin开始的长度为sizeof(sin)的内存清0
 40     sin.sin_family = AF_INET;                            // 因特网地址簇(INET-Internet)
 41     sin.sin_addr.s_addr = INADDR_ANY;                    // 监听所有(接口的)IP地址。
 42     sin.sin_port = htons((u_short)atoi(service));        // 监听的端口号。atoi--把ascii转化为int,htons--主机序到网络序(16位)
 43     bind(msock, (struct sockaddr *)&sin, sizeof(sin));  // 绑定监听的IP地址和端口号
 44
 45     listen(msock, 5);                                   // 等待建立连接的队列长度为5
 46
 47     while(!_kbhit()){                                      // 检测是否有按键
 48        alen = sizeof(struct sockaddr);                   // 取到地址结构的长度
 49        ssock = accept(msock, (struct sockaddr *)&fsin, &alen); // 如果有新的连接请求,返回连接套接字,否则,被阻塞。fsin包含客户端IP地址和端口号
 50
 51        (void) time(&now);                                      // 取得系统时间
 52        pts = ctime(&now);                                      // 把时间转换为字符串
 53        sprintf(buf,"IP :%s 端口号: %d\n",inet_ntoa(fsin.sin_addr),fsin.sin_port);
 54        // sprintf(buf,"%d:%d Hello my friends ! %s",inet_ntoa(sin.sin_addr),fsin.sin_port,pts);
 55        (void) send(ssock, buf, strlen(pts), 0);          // 把缓冲区(指针,长度)的数据发送出去
 56        printf("             TCP(Server) Echo增强程序 \n\n");
 57         printf(" 时间:  %s\n", pts);
 58        printf(" %s\n", buf);                                      // 显示发送字符串
 59         printf("请等待接收数据 :\n");
 60
 61 //flag1:
 62 //       printf("\n您还要传送什么?\n");
 63 //       printf(" 如果想临时改为接收,请键入 * \n");
 64 //    scanf("%s",pts);
 65
 66 //    if(pts[0] == ‘*‘)
 67 //    {
 68 //        printf("\n请等待接收数据\n");
 69 //        sprintf(buf1,"%s",pts);
 70 //    (void) send(ssock, buf1, strlen(pts), 0);
 71 //        goto flag2;
 72 //    }
 73 //    sprintf(buf1,"%s",pts);
 74 //    (void) send(ssock, buf1, strlen(pts), 0);
 75 //    goto flag1;
 76     //     ssock = accept(msock, (struct sockaddr *)&fsin, &alen);
 77
 78 flag2:         cc = recv(ssock, buf1, BUFLEN, 0);
 79          if(cc == SOCKET_ERROR || cc==0)
 80          printf("Error: %d.\n",GetLastError());     //出错。其后必须关闭套接字sock。
 81     else if(cc > 0) {
 82          buf1[cc] = ‘\0‘;    // ensure null-termination
 83          buf2[cc] = ‘\0‘;
 84 //         if(buf1[0] == ‘#‘)
 85 //         {
 86 //             printf("\n您接收到的数据为: # , 请传输数据 \n");
 87 //             goto flag2;
 88 //         }
 89          (void) time(&now);
 90           pts = ctime(&now);
 91          sprintf(buf2,"%s   \n  %s",pts,buf1);
 92     //    strcat(buf2,buf1);
 93          printf("\n您接收到的数据为:");
 94     //     printf(" 时间:  %s\n", pts);
 95            printf("%s\n", buf2);
 96            printf("\n         将自动把此数据返回给客户!\n");
 97            (void) send(ssock, buf1, strlen(pts), 0);
 98            goto flag2;
 99     }
100        (void) closesocket(ssock);                              // 关闭连接套接字
101      }
102     (void) closesocket(msock);                                 // 关闭监听套接字
103      WSACleanup();                                             // 卸载winsock library
104
105 }

Client 部分:

 1 /* TCPClient.cpp */
 2
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <winsock2.h>
 6 #include <string.h>
 7 #include <time.h>
 8 #include "conio.h"
 9 #define    BUFLEN        20000                  // 缓冲区大小
10 #define WSVERS        MAKEWORD(2, 0)        // 指明版本2.0
11 #pragma comment(lib,"ws2_32.lib")         // 使用winsock 2.0 Llibrary
12
13 /*------------------------------------------------------------------------
14  * main - TCP client for TIME service
15  *------------------------------------------------------------------------
16  */
17 char    buf1[BUFLEN+1];
18 char    buf[BUFLEN+1];                   /* buffer for one line of text    */
19 void main(int argc, char *argv[])
20 {
21     char *host = "127.0.0.1";
22 //    char    *host = "10.4.4.146";        /* server IP to connect         */
23
24     char    *service = "5050";          /* server port to connect       */
25     struct sockaddr_in sin,fsin;                /* an Internet endpoint address    */
26
27
28     SOCKET    sock,ssock;                          /* socket descriptor            */
29     int    cc,alen;   /* recv character count            */
30     char    *pts ;
31     time_t    now;
32     WSADATA wsadata;
33     WSAStartup(WSVERS, &wsadata);                          //加载winsock library。WSVERS为请求的版本,wsadata返回系统实际支持的最高版本
34
35     sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);      //创建套接字,参数:因特网协议簇(family),流套接字,TCP协议
36
37                                                       //返回:要监听套接字的描述符或INVALID_SOCKET
38
39     memset(&sin, 0, sizeof(sin));                          // 从&sin开始的长度为sizeof(sin)的内存清0
40     sin.sin_family = AF_INET;                              // 因特网地址簇
41     sin.sin_addr.s_addr = inet_addr(host);                // 服务器IP地址(32位)
42     sin.sin_port = htons((u_short)atoi(service));         // 服务器端口号
43     connect(sock, (struct sockaddr *)&sin, sizeof(sin));  // 连接到服务器
44 //    alen = sizeof(struct sockaddr);
45 //    ssock = accept(sock, (struct sockaddr *)&fsin, &alen);
46                printf("             TCP(Client) Echo增强程序 \n\n");
47  flag1:   cc = recv(sock, buf1, BUFLEN+1, 0);                // cc为接收到的字符的个数(>0)或对方已关闭(=0)或连接出错(<0)
48     if(cc == SOCKET_ERROR || cc==0)
49          printf("Error: %d.\n",GetLastError());     //出错。其后必须关闭套接字sock。
50     else if(cc > 0) {
51          buf1[cc] = ‘\0‘;    // ensure null-termination
52 //         if(buf[0] == ‘*‘)
53 //         {
54 //             printf("\n您接收到的数据为: * , 请传输数据 \n");
55 //             goto flag2;
56 //         }
57          (void) time(&now);                                      // 取得系统时间
58        pts = ctime(&now);
59          printf("您接收到的数据为:\n");
60          printf(" 时间:  %s\n",pts);
61          printf(" %s\n",buf1);                         // 显示所接收的字符串
62     }
63        goto flag2;
64
65 flag2:
66
67
68
69     printf("\n您想传送什么?\n");
70     printf("    如果想关闭连接,请输入 @ \n");
71 //    printf("\n 如果想临时改为接收,请键入 # \n");
72     scanf("%s",pts);
73     if(pts[0] == ‘@‘)
74         goto end;
75 //    if(pts[0] == ‘#‘)
76 //    {
77 //        printf("\n请等待接收数据\n");
78 //        sprintf(buf1,"%s",pts);
79 //     (void) send(sock, buf1, strlen(pts), 0);
80 //        goto flag1;
81 //    }
82     sprintf(buf1,"%s",pts);
83      (void) send(sock, buf1, strlen(pts), 0);
84      goto flag1;
85 end:    closesocket(sock);                             // 关闭监听套接字
86
87     WSACleanup();                                  // 卸载winsock library
88
89     printf("\n按回车键继续...");
90     getchar();                                        // 等待任意按键
91 }

时间: 2024-07-30 10:19:07

【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯的相关文章

【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯

本次实验利用UDP协议, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分: 1 /* UDPServer.cpp */ 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <winsock2.h> 6 #include <string.h> 7 #include "

【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 &quot;多人聊天室&quot;

本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能. 结果大致如: 下面贴上代码(参考参考...) Server 部分: 1 /* TCPdtd.cpp - main, TCPdaytimed */ 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <winsock2.h> 6 #include <

Windows 下的最简单的TCP服务器客户端

他们是短连接的,服务器接受客户端之后,马上发送一个消息,发送完以后立即将客户端断开掉,然后继续等待下一个连接. 使用Winsocket2必须要引用到的头文件和需要包含到的链接库文件: #include <WinSock2.h> #pragma comment( lib, "ws2_32.lib" ) 以下代码是Winsocket2的系统初始化和关闭的封装代码. class WinSocketSystem { public: WinSocketSystem() { int i

TCP服务器/客户端代码示例

TCP服务器代码: 1 #include <errno.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include <iostream> 9 10 usi

C语言学习之Linux下TCP服务器与客户端的实现

客户端代码如下: #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define portnumber 3333 int ma

windows下TCP服务器和客户端的实现

服务器 1.初始化 WSAStartup(..) 2.创建Socket s = Socket ( .. ) 3.绑定端口 ret = bind ( ... ) 4.监听 ret = listen ( .. ) 5.接收客户端的连接请求 s_new = accept ( ... )   // 三次握手发生在这个过程 6.收发数据 ret = recv ( .. ) // 阻塞模式, 内存不够存放发送的信息时,则阻塞send() // 非阻塞 , 视缓冲空间大小而发送相应大的数据,不阻塞send()

socket编程:简单TCP服务器/客户端编程

其实对于socket:我们需要理解的是他提供了一种编程概念,利用socket就可以利用系统已经封装好的内部进行通信,我们只需要关注应用层方面的数据控制就OK了. 一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个&

对Qt下对话服务器客户端的总结(MyTcpServer与MyTcpClient)

Qt编写聊天服务器与客户端主要用到下面两个类: QTcpSocket --- 处理连接的 QTcpServer --- 处理服务器,对接入进行响应,创建每个链接的QTcpSocket实例 编写网络程序需要在 .pro 文件中加上 network,如下 QT += core gui network 1.客户端的编写 客户端需要做的事: 获取服务器的主机ip和端口(port) 链接主机(connectToHost) 链接状态下等待一些信号(signal)的产生并作出相应的回应(slot) 主要等待的

DNS服务器综合实验(包含view下主从+子域授权+转发域)

说明:本文并不是一上来就搭建包含view下主从+子域授权+转发域的实验环境,我们按照先易后难的顺序逐渐深入搭建的.特此说明. ===============================实战======================================= 规划: 主DNS:192.168.0.10 从DNS:192.168.0.11 其他地址:192.168.0.13.192.168.0.14 子域DNS:192.168.0.12 注意:所有工作之前,将所有的主机进行如下设置 [