本次实验利用UDP协议, 语言环境为 C/C++

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

结果应为类似所示:

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

Server 部分:

 /* UDPServer.cpp */

 #include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include "conio.h"
#include <time.h> #define BUFLEN 2000 // 缓冲区大小
#define WSVERS MAKEWORD(2, 2) // 指明版本2.2
#pragma comment(lib,"ws2_32.lib") // 加载winsock 2.2 Llibrary /*------------------------------------------------------------------------
* main - TCP client for DAYTIME service
*------------------------------------------------------------------------
*/
void
main(int argc, char *argv[])
{
char *host = "127.0.0.1"; /* server IP Address to connect */ char *service = ""; /* server port to connect */
struct sockaddr_in sin; /* an Internet endpoint address */
struct sockaddr_in from; /* sender address */
int fromsize = sizeof(from);
char buf[BUFLEN+]; /* buffer for one line of text */
char buf1[BUFLEN+];
SOCKET sock; /* socket descriptor */
int cc; /* recv character count */ char *pts;
time_t now; WSADATA wsadata;
WSAStartup(WSVERS, &wsadata); /* 加载winsock library,WSVERS为请求版本,wsadata返回系统实际支持的最高版本。 */
sock = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP); // 创建UDP套接字, 参数:因特网协议簇(family),数据报套接字,UDP协议号, 返回:要监听套接字的描述符或INVALID_SOCKET
memset(&sin, , sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY; // 绑定(监听)所有的接口。
sin.sin_port = htons((u_short)atoi(service)); // 绑定指定接口。atoi--把ascii转化为int,htons -- 主机序(host)转化为网络序(network), 为short类型。
bind(sock, (struct sockaddr *)&sin, sizeof(sin)); // 绑定本地端口号(和本地IP地址) (void) time(&now); // 取得系统时间
pts = ctime(&now); // 把时间转换为字符串
printf(" \t UDP(Server) Echo增强程序\n\n");
while(!_kbhit()){ //检测是否有按键
flag1: cc = recvfrom(sock, buf, BUFLEN, , (SOCKADDR *)&from, &fromsize); //接收客户数据。返回结果:cc为接收的字符数,from中将包含客户IP地址和端口号。
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);
if (cc == SOCKET_ERROR){
printf("recvfrom() failed; %d\n", WSAGetLastError());
break;
}
else if (cc == )
break;
else{
buf[cc] = '\0';
printf("您收到的数据为:\n %s\n", buf1);
printf("将自动把此数据返回给 Client \n");
goto flag2;
} } flag2: cc = sendto(sock, buf1, , ,(SOCKADDR *)&from, sizeof(from));
if (cc == SOCKET_ERROR){
printf("发送失败,错误号:%d\n", WSAGetLastError());
}
else{
printf("发送成功\n");
goto flag1;
} // cc = recvfrom(sock, buf, BUFLEN, 0, (SOCKADDR *)&from, &fromsize); closesocket(sock);
GlobalFree(buf);
WSACleanup(); /* 卸载某版本的DLL */
}

Client 部分:

 /* UDPClient.cpp */

 #include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h> #define BUFLEN 2000 // 缓冲区大小
#define WSVERS MAKEWORD(2, 2) // 指明版本2.2
#pragma comment(lib,"ws2_32.lib") // 加载winsock 2.2 Llibrary void
main(int argc, char *argv[])
{
char *host = "127.0.0.1"; /* server IP to connect */ char *service = ""; /* server port to connect */
struct sockaddr_in toAddr; /* an Internet endpoint address */
char buf[BUFLEN+]; /* buffer for one line of text */
SOCKET sock; /* socket descriptor */
int cc; /* recv character count */
char *pts; /* pointer to time string */
time_t now; /* current time */ int toAddrsize = sizeof(toAddr); WSADATA wsadata;
WSAStartup(WSVERS, &wsadata); /* 启动某版本Socket的DLL */ sock = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP); memset(&toAddr, , sizeof(toAddr));
toAddr.sin_family = AF_INET;
toAddr.sin_port = htons((u_short)atoi(service)); //atoi:把ascii转化为int. htons:主机序(host)转化为网络序(network), s--short
toAddr.sin_addr.s_addr = inet_addr(host); //如果host为域名,需要先用函数gethostbyname把域名转化为IP地址 // memset(buf,' ',1000); //fill 1000 bytes with 'e'
buf[] = '\0';
(void) time(&now); // 取得系统时间
pts = ctime(&now); // 把时间转换为字符串
// memcpy(buf,pts,strlen(pts));
sprintf(buf,"%s ",pts);
printf(" UDP(Client) Echo增强程序\n\n");
printf(" 时间 :%s",buf); cc = sendto(sock, buf, , ,(SOCKADDR *)&toAddr, sizeof(toAddr));
flag2: if (cc == SOCKET_ERROR){
printf("发送失败,错误号:%d\n", WSAGetLastError());
}
else{
printf(" 发送成功 \n");
cc = recvfrom(sock, buf, BUFLEN, , (SOCKADDR *)&toAddr, & toAddrsize);
printf(" 您接收到的数据为:\n %s \n",buf);
printf("键入 # 继续发送,键入 @ 停止发送\n");
scanf("%s",pts);
if(pts[]=='#')
{
printf(" 请输入要发送的数据 :\n");
goto flag1;
}
if(pts[]=='@')
goto end; } flag1:
scanf("%s",pts);
sprintf(buf,"%s ",pts);
cc = sendto(sock, buf, , ,(SOCKADDR *)&toAddr, sizeof(toAddr)); goto flag2; getchar(); closesocket(sock); end: GlobalFree(buf);
WSACleanup(); /* 卸载某版本的DLL */ getchar(); }

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

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

    本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...

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

    本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能. 结果大致如: 下面贴上代码(参考参考.. ...

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

      UDP是面向非连接的协议,因此在实现UDP服务器时,服务器不用总是处于监听状态.可以直接收发数据.   服务器端   1.初始化 WASStartup ( ... )   2.创建Socket s ...

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

    UDP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...

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

    在汇文培训老师给讲了这个例子.讲的挺好的 Qt编写聊天服务器与客户端主要用到下面两个类: QTcpSocket --- 处理连接的 QTcpServer --- 处理服务器,对接入进行响应,创建每个链 ...

  6. TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库

    这个库andrdoi也可以用,而且是基于类的使用方式: 它支持类似聊天室的功能,即一个人说话,所有客户端都能收到,当然也支持点点通信.它还支持 RMI 的方式调用远程过程. https://githu ...

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

    UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包. ...

  8. Linux下UDP简介及程序设计

    一.UDP简介 UDP(User Datagram Protocol),用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.UDP提供了无连接通信,且不对传 ...

  9. 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。

    1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...

随机推荐

  1. 10-12Linux流编程的一些知识点

    第五章  Linux 的流编程 Linux流操作基础      流和文件的关系:流相当于一个缓冲区,可以将文件描述符和流关联,获得相应的缓冲区,以此来提高系统对磁盘的存取速度.     流的结构和操作 ...

  2. 从0开始学习Unity的学习笔记(I 界面学习和简单模型拼装)

    先给一个大致今天学习的图,然后后面是细节 1.下载Unity :官网下载需要版本 2.Unity安装:一定不要有中文路径:一台电脑可以安装不同版本的Unity,但是要安装在不同的文件夹下: 3. 新建 ...

  3. MVC中获取所有按钮,并绑定事件!

    <script> var btns = $('[id=addbtn]'); //不能直接使用#ID来获取,必须用[] //循环遍历所有的按钮,一个一个添加事件绑定   for (var i ...

  4. 如何关闭SQL进程

    --通过下面的查询得到trace ID select * from sys.traces --修改下面的@traceid参数,关闭,删除对应的trace exec sp_trace_setstatus ...

  5. mac下MySQL、MysqL workbench的安装与配置配置

    请戳这里 但是3.4的创建instance还不会

  6. 使用html2canvas截图并用jspdf打印的问题

    之前的方案确实可以打印出a4的大小的pdf,但是也呈现了诸多问题,因为这种方法是截图然后再进行打印的,所以打印出来的效果是模糊的,思前想后决定放弃了这种方式. 最终还是决定使用浏览器自带的打印方法. ...

  7. 记一次优化ansible inventory的小例子

    起因: 阿里云新扩容一批机器,要对上面的flume配置做修改 之前的inventory是这样子的 [user@vip10-ali-tj-console host_vars]$ sdiff vip10- ...

  8. 爬虫5:beautifulsoup

      灵活方便的网页解析库,处理高效,支持多种解析器,利用它不用编写正则表达式即可方便的实现网页信息的提取     一. BeautifulSoup的几种解析库   解析器 使用方法 优势 劣势 Pyt ...

  9. 基于注解的Spring容器源码分析

    从spring3.0版本引入注解容器类之后,Spring注解的使用就变得异常的广泛起来,到如今流行的SpringBoot中,几乎是全部使用了注解.Spring的常用注解有很多,有@Bean,@Comp ...

  10. Mixnode 让操作网络资源和数据库一样简单,不一样的爬虫!

    简评: hacker news 上刷的一篇文章,可以使用类似操作数据库的方式访问网络上的资源,可以大大简化爬虫的代码. Mixnode 将网络变成了一个巨大的数据库!换句话说,Mixnode 允许您将 ...