【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 ...
随机推荐
- TSQL--INT转换成指定长度字符串
-- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ...
- 查找 SQL SERVER 所有表记录数
-- 所有表的记录数 SELECT a.name, b.rowsFROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.idWHERE ...
- shell相关文件
站在用户登录的角度来说,SHELL的类型: 登录式shell: 正常通常某终端登录 su - USERNAME su -l USERNAME 非登录式shell: su USERNAME 图形终端下 ...
- ADO.NET操作SQL Server:数据库操作类(未封装)
1.添加数据 /// <summary> /// 添加数据 /// </summary> /// <param name="newEntity"> ...
- ASP.NET Core IdentityServer4 新手上路
OAuth2.0资料 今天看到一篇博主写了该系列文章,贴图和过程都比较详细,俗话说实践是检验真理的唯一标准(如果是按照参考文章复制粘贴,应该不会出现踩坑,但是我喜欢自己手动敲一遍),发现几个坑,因而总 ...
- deepin jdk 安装
一.安装JDK环境 1 .卸载系统自带的Openjdk(可能不需要) 先用检测是否安装了openjdk dpkg -l | grep openjdk 如果安装了, 使用下面命令卸载. sudo apt ...
- ES5和ES6作用域
ES5和ES6作用域 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- java异常术语
.检查性异常: 不处理编译不能通过 .非检查性异常:不处理编译可以通过,如果有抛出直接抛到控制台(所有RuntimeException的派生类都是非检查型异常) .非运行时异常: 就是检查性异常4.运 ...
- Docker的安装与启动教程
一.安装Docker Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的.在很多版本的CentOS中是 ...
- Kali Linux来袭~老司机带你进击
Kali是BackTrackLinux完全遵循Debian开发标准彻底的完全重建.全新的目录框架,复查并打包所有工具,我们还为VCS建立了Git树. 本次推荐内容主要介绍Kali-Linux的安装,包 ...