【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 "conio.h"
 8 #include <time.h>
 9
10 #define    BUFLEN        2000                  // 缓冲区大小
11 #define WSVERS        MAKEWORD(2, 2)        // 指明版本2.2
12 #pragma comment(lib,"ws2_32.lib")         // 加载winsock 2.2 Llibrary
13
14 /*------------------------------------------------------------------------
15  * main - TCP client for DAYTIME service
16  *------------------------------------------------------------------------
17  */
18 void
19 main(int argc, char *argv[])
20 {
21     char   *host = "127.0.0.1";        /* server IP Address to connect */
22
23     char   *service = "5050";          /* server port to connect       */
24     struct sockaddr_in sin;            /* an Internet endpoint address    */
25     struct sockaddr_in from;        /* sender address               */
26     int    fromsize = sizeof(from);
27     char   buf[BUFLEN+1];           /* buffer for one line of text    */
28     char   buf1[BUFLEN+1];
29     SOCKET    sock;                      /* socket descriptor            */
30     int    cc;                            /* recv character count            */
31
32     char    *pts;
33     time_t    now;
34
35     WSADATA wsadata;
36     WSAStartup(WSVERS, &wsadata);   /* 加载winsock library,WSVERS为请求版本,wsadata返回系统实际支持的最高版本。    */
37     sock = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP); // 创建UDP套接字, 参数:因特网协议簇(family),数据报套接字,UDP协议号, 返回:要监听套接字的描述符或INVALID_SOCKET
38     memset(&sin, 0, sizeof(sin));
39     sin.sin_family = AF_INET;
40     sin.sin_addr.s_addr = INADDR_ANY;                     // 绑定(监听)所有的接口。
41     sin.sin_port = htons((u_short)atoi(service));         // 绑定指定接口。atoi--把ascii转化为int,htons -- 主机序(host)转化为网络序(network), 为short类型。
42     bind(sock, (struct sockaddr *)&sin, sizeof(sin));     // 绑定本地端口号(和本地IP地址)
43
44     (void) time(&now);                                      // 取得系统时间
45        pts = ctime(&now);                                      // 把时间转换为字符串
46        printf("           \t     UDP(Server) Echo增强程序\n\n");
47      while(!_kbhit()){                                    //检测是否有按键
48 flag1:        cc = recvfrom(sock, buf, BUFLEN, 0, (SOCKADDR *)&from, &fromsize);  //接收客户数据。返回结果:cc为接收的字符数,from中将包含客户IP地址和端口号。
49         sprintf(buf1," \t\t 时间:  %s \t\t Client【IP: %s  端口号: %d  】\n  \t\t  数据:   %s",pts,inet_ntoa(from.sin_addr),from.sin_port,buf);
50         if (cc == SOCKET_ERROR){
51             printf("recvfrom() failed; %d\n", WSAGetLastError());
52             break;
53         }
54         else if (cc == 0)
55             break;
56         else{
57             buf[cc] = ‘\0‘;
58             printf("您收到的数据为:\n   %s\n", buf1);
59             printf("将自动把此数据返回给 Client  \n");
60             goto flag2;
61         }
62
63     }
64
65 flag2:    cc = sendto(sock, buf1, 1000, 0,(SOCKADDR *)&from, sizeof(from));
66    if (cc == SOCKET_ERROR){
67         printf("发送失败,错误号:%d\n", WSAGetLastError());
68           }
69     else{
70         printf("发送成功\n");
71         goto flag1;
72          }
73
74 //    cc = recvfrom(sock, buf, BUFLEN, 0, (SOCKADDR *)&from, &fromsize);
75
76     closesocket(sock);
77     GlobalFree(buf);
78     WSACleanup();                     /* 卸载某版本的DLL */
79 }

Client 部分:

 1 /* UDPClient.cpp */
 2
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <winsock2.h>
 6 #include <string.h>
 7 #include <time.h>
 8
 9 #define    BUFLEN        2000                  // 缓冲区大小
10 #define WSVERS        MAKEWORD(2, 2)        // 指明版本2.2
11 #pragma comment(lib,"ws2_32.lib")         // 加载winsock 2.2 Llibrary
12
13 void
14 main(int argc, char *argv[])
15 {
16     char    *host = "127.0.0.1";        /* server IP to connect         */
17
18     char    *service = "5050";          /* server port to connect       */
19     struct sockaddr_in toAddr;            /* an Internet endpoint address    */
20     char    buf[BUFLEN+1];                   /* buffer for one line of text    */
21     SOCKET    sock;                          /* socket descriptor            */
22     int    cc;                                /* recv character count            */
23     char    *pts;                    /* pointer to time string            */
24     time_t    now;                    /* current time                        */
25
26     int    toAddrsize = sizeof(toAddr);
27
28     WSADATA wsadata;
29     WSAStartup(WSVERS, &wsadata);       /* 启动某版本Socket的DLL        */
30
31     sock = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP);
32
33     memset(&toAddr, 0, sizeof(toAddr));
34     toAddr.sin_family = AF_INET;
35     toAddr.sin_port = htons((u_short)atoi(service));    //atoi:把ascii转化为int. htons:主机序(host)转化为网络序(network), s--short
36     toAddr.sin_addr.s_addr = inet_addr(host);           //如果host为域名,需要先用函数gethostbyname把域名转化为IP地址
37
38
39 //    memset(buf,‘ ‘,1000);  //fill 1000 bytes with ‘e‘
40     buf[1000] = ‘\0‘;
41     (void) time(&now);                                      // 取得系统时间
42     pts = ctime(&now);                                      // 把时间转换为字符串
43 //    memcpy(buf,pts,strlen(pts));
44     sprintf(buf,"%s ",pts);
45     printf("                        UDP(Client) Echo增强程序\n\n");
46      printf("  时间 :%s",buf);
47
48
49
50     cc = sendto(sock, buf, 1000, 0,(SOCKADDR *)&toAddr, sizeof(toAddr));
51  flag2:   if (cc == SOCKET_ERROR){
52         printf("发送失败,错误号:%d\n", WSAGetLastError());
53      }
54     else{
55         printf("       发送成功 \n");
56          cc = recvfrom(sock, buf, BUFLEN, 0, (SOCKADDR *)&toAddr, & toAddrsize);
57          printf(" 您接收到的数据为:\n %s \n",buf);
58         printf("键入 # 继续发送,键入 @ 停止发送\n");
59         scanf("%s",pts);
60         if(pts[0]==‘#‘)
61         {
62             printf("    请输入要发送的数据 :\n");
63             goto flag1;
64         }
65         if(pts[0]==‘@‘)
66             goto end;
67
68
69     }
70
71 flag1:
72     scanf("%s",pts);
73     sprintf(buf,"%s ",pts);
74     cc = sendto(sock, buf, 1000, 0,(SOCKADDR *)&toAddr, sizeof(toAddr));
75
76     goto flag2;
77
78
79
80     getchar();
81
82     closesocket(sock);
83
84 end:    GlobalFree(buf);
85     WSACleanup();                     /* 卸载某版本的DLL */
86
87     getchar();
88
89 }

时间: 2024-12-16 19:10:25

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

【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

【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 socket+UDP服务器客户端】

Windows Socket+UDP服务器客户端 Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷.相比与TCP,UDP不需要建立连接(不需connect.accept函数),数据发送接收之后,不需要终止连接.基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会有数据的丢失

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

UDP是面向非连接的协议,因此在实现UDP服务器时,服务器不用总是处于监听状态.可以直接收发数据. 服务器端 1.初始化 WASStartup ( ... ) 2.创建Socket s = socket ( .. ) 3.绑定 bind( .. ) 4.收发数据 recvfrom( .. ) sendto(..) 5.关闭连接,释放资源 closesocket(..) WSACleanup() 客户端 // 无需绑定 1.初始化 WASStartup ( ... ) 2.创建Socket s =

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

UDP服务器代码: 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

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

对于之前的TCP协议而言,他是可靠的字节流传输,而在socket编程中,在不需要保证数据传输正确安全的情况下.或者由用户自己完成传输确认情况/服务端客户端自己实现数据传输.套接字编程也提供了UDP协议的方法. 基于UDP(不是面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)和服务器端进行通信(sendto) (3)关闭套接字 因为在socket编程中,UDP是针对数据报的数据传输,所以socket专门定义了UDP所使用的函数接口.

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

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

socket本地模拟UDP 服务器+客户端(三)

UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不能到达就不知道了. 虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议. 服务端程序: # 1 创建套接字,并绑定到当地地址 socket,bing # 2 直接接收数据从buffer.Recvfrom(),这个函数接受到数据,和#s

uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)

目前移植uip,发现UDP 服务器模式下,必须指定本地端口以及客户端端口,否则只能讲客户端端口设置为0,才能接收任意端口的数据,但是无法发送数据,因为此时客户端端口设置为0了,我通过将原始数据包中的客户端端口保存下来,并且在发送的时候将客户端端口替换为指定的端口,发送完成之后又设置为0,这样就实现了向任意客户端端口发送数据. uip.c if(uip_udp_conn->lport != 0 && UDPBUF->destport == uip_udp_conn->lpo