【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯
本次实验利用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, 服务器/客户端 通讯的更多相关文章
- 【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...
- 【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能. 结果大致如: 下面贴上代码(参考参考.. ...
- windows下UDP服务器和客户端的实现
UDP是面向非连接的协议,因此在实现UDP服务器时,服务器不用总是处于监听状态.可以直接收发数据. 服务器端 1.初始化 WASStartup ( ... ) 2.创建Socket s ...
- UDP服务器/客户端代码示例
UDP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...
- 对Qt下对话服务器客户端的总结(MyTcpServer与MyTcpClient)
在汇文培训老师给讲了这个例子.讲的挺好的 Qt编写聊天服务器与客户端主要用到下面两个类: QTcpSocket --- 处理连接的 QTcpServer --- 处理服务器,对接入进行响应,创建每个链 ...
- TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库
这个库andrdoi也可以用,而且是基于类的使用方式: 它支持类似聊天室的功能,即一个人说话,所有客户端都能收到,当然也支持点点通信.它还支持 RMI 的方式调用远程过程. https://githu ...
- socket本地模拟UDP 服务器+客户端(三)
UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包. ...
- Linux下UDP简介及程序设计
一.UDP简介 UDP(User Datagram Protocol),用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.UDP提供了无连接通信,且不对传 ...
- 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。
1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...
随机推荐
- 企业IT架构转型之道 读书笔记-1.阿里巴巴集团中台战略引发的思考
前言 1.为什么选择看这本书 2.Supercell公司的开发模式 3.“烟囱式”系统建设模式弊端,及产生这种现象的原因 4.IT人员在企业信息中心的组织职能 一.为什么选择看这本书 多日没有更新博客 ...
- openvswitch dpdk
作者:张华 发表于:2016-04-07版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 硬件要 ...
- 【OCP-12c】CUUG 071题库考试原题及答案解析(15)
15.(6-24)choose the best answerExamine the structure of the MEMBERS table:You want to display detail ...
- 常用类(日期时间格式转换,date,枚举)
1 常用类 1.1 日期时间类 计算机如何表示时间? 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms ...
- “全栈2019”Java多线程第九章:判断线程是否存活isAlive()详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- idea IDE 导入的项目没有显示目录结构
解决方法:1.关闭 idea 2.删除该项目录下的 .idea 文件 3.重新 open 项目
- Wannafly挑战赛26题解
为啥混进了几道不是魔禁的题--出题人太不敬业了-- 传送门 \(A\) 御坂网络 为啥没有番外个体和整体意志呢 暴力模拟就好了,这个要是都打错我干脆滚回去学文化课算了 //minamoto #incl ...
- C语言中宏定义与C++中的内联函数
一,宏定义:在预处理的时候把宏定义的内容替换到代码中,正常编译. 1,无参数宏定义和有参数宏定义 (1)宏定义不能加分号,比如:#define PI 3.24;错的,#define PI 3.24 ...
- (二)SSO之CAS框架单点退出,自定义退出界面.
用CAS的退出,只能使用它自己的那个退出界面,如果有这样的要求, 要求退出后自动跳转到登录界面, 该如何做呢?下面这篇文章实现了退出后可以自定义跳转界面. 用了CAS,发现退出真是个麻烦事,退出后跳 ...
- yum 安装和卸载
yum list列出资源库中特定的可以Linux Yum安装或更新以及已经安装的rpm包 安装 yum install 安装包关键字 卸载 yum remove 安装包名