TCP\UDP服务器与客户端

2023-11-15

作业:
1. 搭建TCP服务器 客户端
2. 搭建UDP服务器 客户端

TCP服务器:

#include <myhead.h>

#define ERR_MSG(msg) do{\
	fprintf(stderr, "line:%d : %s  %s  ",__LINE__,__FILE__,__func__);\
	perror(msg);\
}while(0)

#define IP "192.168.2.85" 		//ifconfig出来的本机IP
#define PORT 6666 				//1024~49151,网络字节序


int main(int argc, const char *argv[])
{
	//创建流式套接字
	int sfd = socket(AF_INET,SOCK_STREAM,0);
	if(sfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}

	//允许端口快速被重用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速重用成功 __%d__\n", __LINE__);
	

	//填充服务器的地址信息结构体,给bind函数绑定
	//真实的地址信息结构体根据地址族制定:AF_INET:man 7 ip
	struct sockaddr_in sin;
	 
	sin.sin_family 		= AF_INET;   	  	    //必须填AF_INET
	sin.sin_port 		= htons(PORT); 	  		//网络字节序
	sin.sin_addr.s_addr = inet_addr(IP); 		//ifconfig出来的本机IP


	//绑定服务器IP和端口
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
	{
		ERR_MSG("bind");
		return -1;
	}
	printf("bind success __%d__\n",__LINE__);
	
	//将套接字设置为被动监听状态
	if(listen(sfd,128)<0)
	{
		ERR_MSG("listen");
		return -1;
	}
	printf("listen success __%d__\n",__LINE__);

	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);

	//获取连接成功后的新的套接字文件描述符
	int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
	if (newfd < 0)
	{
		ERR_MSG("accept");
		return -1;
	}
	printf("[%s:%d]客户端连接成功 newfd = %d __%d__\n",\
			inet_ntoa(cin.sin_addr),ntohs(cin.sin_port), newfd,__LINE__);
	
	char buf[128] = "";
	ssize_t res = 0;
	while(1)
	{
		bzero(buf,sizeof(buf));
		//接受
		res = recv(newfd,buf,sizeof(buf),0);
		if(res < 0)
		{
			ERR_MSG("recv");
			return -1;
		}
		else if(0 == res)
		{
			printf("[%s:%d]客户端下线,newfd = %d __%d__\n",\
					inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
			break;
		}
		printf("newfd = %d: %s\n",newfd,buf);
		//发送
		struct(buf,**);
		if(send(newfd,buf,sizeof(buf),0)<0)
		{
			ERR_MSG("send");
			return -1;
		}
		printf("send success __%d__\n",__LINE__);




	}
	
	//关闭套接字文件描述符
	close(newfd);
	close(sfd);


	return 0;
}

TCP客户端:

#include <myhead.h>

#define ERR_MSG(msg) do{\
	fprintf(stderr, "line:%d : %s  %s  ",__LINE__,__FILE__,__func__);\
	perror(msg);\
}while(0)

#define IP "192.168.2.85" 		//ifconfig出来的本机IP
#define PORT 6666 				//1024~49151,网络字节序


int main(int argc, const char *argv[])
{
	//创建流式套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}
	
	//绑定客户端自身的地址信息结构体
	//若不绑定,则操作系统会自动帮cli绑定IP和端口
	//IP:客户端运行环境的IP地址
	//port:默认从49151~65535范围动态选择

	//填充服务器的地址信息结构体,给connect函数绑定
	//客户端想连接哪个服务器,就填哪个服务器绑定的IP和端口
	struct sockaddr_in sin;
	 
	sin.sin_family 		= AF_INET;   	  	    //必须填AF_INET
	sin.sin_port 		= htons(PORT); 	  		//网络字节序
	sin.sin_addr.s_addr = inet_addr(IP); 		//ifconfig出来的本机IP


	//绑定服务器IP和端口
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
	{
		ERR_MSG("connect");
		return -1;
	}
	printf("connect success __%d__\n",__LINE__);
	

	
	char buf[128] = "";
	ssize_t res = 0;
	while(1)
	{
		bzero(buf,sizeof(buf));
		//发送
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1] = 0;
		if(send(cfd,buf,sizeof(buf),0)<0)
		{
			ERR_MSG("send");
			return -1;
		}
		printf("send success __%d__\n",__LINE__);

		//接收
		res = recv(cfd,buf,sizeof(buf),0);
		if(res < 0)
		{
			ERR_MSG("recv");
			return -1;
		}
		else if(0 == res)
		{
			printf("服务器下线__%d__\n",__LINE__);
			break;
		}
		printf(":%s __%d__\n",buf,__LINE__);
	}
	
	//关闭套接字文件描述符
	close(cfd);
	return 0;
}

UDP服务器:

#include <myhead.h>

#define ERR_MSG(msg) do{\
	fprintf(stderr, "line:%d : %s  %s\n",__LINE__,__FILE__,__func__);\
	perror(msg);\
}while(0)

#define IP "192.168.2.85" 		//ifconfig出来的本机IP
#define PORT 6666 				//1024~49151,网络字节序


int main(int argc, const char *argv[])
{
	//创建流式套接字
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("create socket success sfd = %d __%d__\n",sfd,__LINE__);

	//填充服务器的地址信息结构体
	//真实的地址信息结构体根据地址族制定:AF_INET:man 7 ip
	struct sockaddr_in sin;
	 
	sin.sin_family 		= AF_INET;   	      //必须填AF_INET
	sin.sin_port 		= htons(PORT); 	  //网络字节序
	sin.sin_addr.s_addr = inet_addr(IP); 		//ifconfig出来的本机IP


	//绑定地址信息结构体
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
	{
		ERR_MSG("bind");
		return -1;
	}
	printf("bind success __%d__\n",__LINE__);

	char buf[128] = "";
	struct sockaddr_in cin; 		//存储数据包是从何而来
	socklen_t addrlen = sizeof(cin);
	while(1)
	{
		bzero(buf,sizeof(buf));
		//接收数据
		if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen) < 0)
		{
			ERR_MSG("recvfrom");
			return -1;
		}
		printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);

		//发送数据
		strcat(buf,"**");
		if (sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0)
		{
			ERR_MSG("send");
			return -1;
		}
		printf("send success __%d__\n",__LINE__);

	}
	
	//关闭套接字文件描述符
	close(sfd);
	return 0;
}

UDP客户端:

#include <myhead.h>

#define IP "192.168.2.85"  //ifconfig出来的本机IP
#define PORT 6666           //1024~49151,网络字节序

#define ERR_MSG(msg) do{\
    fprintf(stderr, "line:%d: %s %s\n", __LINE__, __FILE__, __func__);\
    perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd<0)
	{
		ERR_MSG("socket");
		return -1;
	}

	//刷新端口号
	int reuse=1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}


    struct sockaddr_in sin;
    sin.sin_family      = AF_INET;          //必须填AF_INET;
    sin.sin_port        = htons(PORT);      //1024~49151,网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);    //ifconfig出来的本机IP

/*
    //连接服务器
    if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("connect");
        return -1;
    }
    printf("connect success __%d__\n", __LINE__);
*/
    char buf[128] = "";
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);

	while(1)
	{
		bzero(buf,sizeof(buf));

		//发送
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf) -1] = 0;

		if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
		{
			ERR_MSG("sendto");
			return -1;
		}
		printf("send success __%d__\n",__LINE__);

		bzero(buf,sizeof(buf));

		//接收
		if(recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
		{
			ERR_MSG("recvfrom");
			return -1;
		}
		printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

	}

	close(cfd);
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP\UDP服务器与客户端 的相关文章

  • 是否可以将 char * 转换为结构?

    这是我的问题 rcvfrom 参数之一是 char 一旦我从中获取数据 我想将其转换为结构 然而选角并不成功 我究竟做错了什么 这是我所做的 struct int8 t seq int8 t ack bool flag char data
  • C# UDP广播和接收示例

    问题 我正在尝试将 udp 套接字绑定到特定地址 我会广播一条消息 同一个套接字需要能够接收消息 当前代码 static void Main UdpClient Configuration new UdpClient new IPEndPo
  • UDP 数据包在交付时是否保证是完整的、具有实际意义的?

    众所周知 UDP 用户数据报协议 并不安全 因为用它发送的数据包的顺序可能不按顺序传送 甚至根本不按顺序传送 但是 如果发送了 UDP 数据包 该数据包中的信息在实际意义上 99 99 及以上 是否保证正确 在实际意义上 99 99 及以上
  • 如何设置Winsock UDP套接字?

    我想创建一个仅向客户端发送数据的 Winsock UDP 套接字 我希望内核为我选择一个可用的端口 另一方面 我想指出要使用哪个本地 IP 因为我正在运行一些网卡 我尝试过梳理迷宫般的套接字选项 以及将套接字地址中的端口绑定设置为 0 但均
  • Spark Scala UDP 在侦听端口上接收

    中提到的例子http spark apache org docs latest streaming programming guide html http spark apache org docs latest streaming pro
  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • UdpClient 在广播地址上接收

    在 c 中 我使用 UdpClient Receive 函数 public void StartUdpListener Object state try udpServer new UdpClient new IPEndPoint IPAd
  • 简单的udp代理解决方案

    我正在寻找可以代理我的 udp 数据包的解决方案 我有一个客户端向服务器发送 udp 数据包 它们之间的连接非常糟糕 导致大量数据包丢失 一种解决方案是使用一个新的代理服务器 它将所有数据包从客户端重定向到目标服务器 新的代理服务器与这两个
  • Java:使用多个 DatagramSocket 接收 UDP 数据报包

    我正在尝试实现一种将 UDP 数据包发送到多个接收者的方法 我认为这应该是可行的设置setReuseAddress true 在接收 DatagramSocket 实例上 我的问题是 在某些情况下 我需要限制与本地计算机的通信 因此限制本地
  • 具有多个接口的 Python UDP 套接字

    我正在 Windows XP 机器上用 python2 7 编写脚本 本机使用不同的网卡连接到多个网络 我遇到了一个问题 我已将 UDP 套接字绑定到特定接口 我知道您可以通过仅提供网卡现有的 IP 地址来在 Windows 中完成此操作
  • NodeJS UDP 多播如何

    我正在尝试将 UDP 多播数据包发送到 230 185 192 108 以便每个订阅的人都会收到 有点卡住了 我相信它的广播正确 但似乎无法从任何客户端获取任何信息 Server var news Borussia Dortmund win
  • C# 广播是UDP消息,监听多个回复

    我正在尝试编写一些执行 UDP 广播的代码 然后侦听来自远程服务器的答复 说明它们存在 它用于识别子网上运行服务器应用程序的计算机 因此基本上会发出 谁在那儿 并听取所有答复 我在 Java 中有这个 工作完美 它将 DatagramPac
  • TCP 兼容性:为什么 TCP 不兼容数据包广播和组播操作?

    http en wikipedia org wiki User Datagram Protocol http en wikipedia org wiki User Datagram Protocol 与 TCP 不同 UDP 与数据包广播
  • C++ UDP Socket端口复用

    如何在 C 中创建客户端 UDP 套接字 以便它可以侦听另一个应用程序正在侦听的端口 换句话说 如何在 C 中应用端口复用 我只想监听一个端口 您可以使用嗅探器来做到这一点 只需忽略来自不同端口的数据包即可 我可能需要阻止它发送一些特定的数
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进

随机推荐

  • python爬虫第9天 用爬虫测试网站 远程采集

    网站的前端通常并没 有自动化测试 尽管前端才是整个项目中真正与用户零距离接触的唯一一个部分 想象有一个由测试驱动的网络开发项目 每天进行测试以保证网络接口的每个环节的功能 都是正常的 每当有新的特性加入网站 或者一个元素的位置改变时 就执行
  • RecycleView 添加底部加载更多

    在阅读此文章前 请先看 http blog csdn net fangchao3652 article details 43148871 与开头的连接文章思想类似 只不过那个是图片文字按钮等多种布局的混排 而添加底部只是普通Item 与底部
  • python 头条 sign 参数 此篇针对实时列表 请使用73版本的谷歌浏览器

    1 首先谷歌浏览器打开今日头条F12调试找到sources 以旅游模块为例以此类推都一样 网站如https www toutiao com ch news travel 2 ctrl shift f全局搜索 window byted acr
  • MD5算法全解析

    前言 这段时间刚好正在做软件安全的实验和课设 学习了各种加密算法 比如对称加密算法的DES AES 非对称加密算法的RSA 再如今天要讲的主角 单向加密算法的MD5 为什么这么多算法 MD5成为了今天的猪脚呢 这是因为个人感觉在目前Andr
  • 【PTA】最长的括号子串 模拟

    给出一个长度为 n 的 仅包含字符 和 的字符串 计算最长的格式正确的括号子串的长度 例1 对于字符串 来说 最长的格式正确的子串是 长度为 2 例2 对于字符串 来说 最长的格式正确的子串是 长度为 4 字符串长度 0 n 5 10 5
  • 【SSD 代码精读】之 model (Backbone)& loss

    model 1 Backbone 1 ResNet 50 2 截取 ResNet 50 的前半部分作为 backbone 2 Module 3 Loss Function 1 location loss 2 confidence loss
  • Ubuntu下跑Aplaca报错:torch.cuda.0utofMemoryError: CUDA out of memory.解决办法(查看CUDA占用情况&清除GPU缓存)

    缓存不够 并非内存容量不够 错误提示 torch cuda 0utofMemoryError CUDA out of memory Tried to allocate 2 00 MiB PU 0 23 69 GiB total capaci
  • 计算机教育中缺失的一课:命令行环境

    点击蓝字 关注我们 内容来源于 计算机教育中缺失的一课 在 Attribution NonCommercial ShareAlike 4 0 International CC BY NC SA 4 0 下获得许可 另外 还可在蓝桥云课社区
  • linux修改密码提示权限拒绝,linux – ssh命令后权限被拒绝,即使密码正确

    我已经通过网线将Raspberry Pi 2连接到我的笔记本电脑 我正在尝试将文件从计算机传输到raspi但是命令ssh usr blabla local 要求我输入密码 我确信密码是正确的但是我得到了权限否认 请再试一次 我能做什么 我无
  • uni-app App端半屏连续扫码

  • 双向可控硅的工作原理

    先看下图的工作原理 如果想简单一点只要记住一句话即可 只要在G端有信号 那么T1 T2这条路就是通的 只有G在零点的时候才不会导通 主要来看一下应用吧 来看我们公司的一个电路图 其实双向可控硅多数用在交流电路中 简单介绍一下 Q5是三极管
  • 期权开户流程、交易时间和规则详解清晰易懂

    本文将介绍期权开户流程 交易时间和规则详解清晰易懂则 包括期权的定义 期权交易的时间 期权交易的规则和期权交易的风险 本文的结论是 期权交易的时间和规则非常重要 应该遵守交易规则 并且要注意风险 本文来源 期权酱 券商开通期权账户和期权分仓
  • 【ISO14229_UDS_0x23服务详解】

    目录 1 0x23服务 根据地址读取内存服务 2 请求报文格式 2 1 请求报文定义 2 2 请求报文中子函数参数定义 2 3 请求报文中数据参数定义 3 肯定应答报文 3 1 肯定应答报文格式定义 3 2 肯定应答报文数据参数定义 4 支
  • 解决mysql重新安装时输入原密码问题

    1 清除MYSQL的安装目录 默认是C Program Files 2 清除MYSQL数据存放目录 一般在C Documents and Settings All Users windows Application Data目录下 需要注意
  • python练习题

    练习 对于任意数字列表 从键盘输入一个数字 sum表示 找到列表中两两相加等于sum的数字 num list 3 2 4 7 1 sum 5 打印列表 3 2 4 1 fou循环实现 num list 3 2 4 7 1 sum 5 lis
  • ES搜索引擎之ES介绍,安装以及辅助插件Kibana的安装

    文章目录 ES搜索引擎之ES介绍 安装以及辅助插件Kibana的安装 ElasticSearch介绍 1 1为什么会有ElasticSearch搜索引擎 1 2ES的介绍 1 3什么是倒排索引 ElasticSearch的安装 下载elas
  • 强大的4开关升降压BOB电源 可升可降能大能小

    原文来自公众号 工程师 基于电感器的开关架构电源有3中常见的拓扑结构 分别是BUCK降压电源 BOOST升压电源以及BUCK BOOST负压电源 今天介绍的第4中拓扑 4开关BOB电源 在手机 汽车 嵌入式等领域都有广泛应用 它的基本工作原
  • http响应头connection的作用

    http chenchendefeng iteye com blog 461248 有的网站会在服务器运行一段时间后down掉 有很多原因可能造成这种现象 比如tomcat堆和非堆内存设置不足 程序没能释放内存空间造成内存溢出 或者某些进程
  • 渗透测试信息收集

    信息收集 渗透的本质是信息收集 信息收集分为主动信息收集和被动信息收集 主动信息收集能够收集到更多的信息 但是会产生痕迹 容易被溯源 被动信息收集是信息收集的第一步 通过第三方工具进行收集 不与主机直接交互 需要收集的信息包括 域名 子域名
  • TCP\UDP服务器与客户端

    作业 1 搭建TCP服务器 客户端 2 搭建UDP服务器 客户端 TCP服务器 include