当前位置: 首页 > news >正文

网络编程:TCP和UDP通信基础

TCP

简易服务器:

#include<myhead.h>int main(int argc, const char *argv[])
{int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("bind");return -1;}//3.监听if(listen(oldfd,BACKLOG) == -1){perror(listen);return -1;}//建立连接struct sockaddr_in client;  //存储客户端信息的结构体int client_len = sizeof(client);int newfd;if((newfd = accept(oldfd,(struct sockaddr *)&client,&client_len)) == -1){perror("accept");return -1;}printf("与%s:%d建立连接\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));char buff[1024];while(1){int res = read(newfd,buff,sizeof(buff));printf("接收到信息:%s\n",buff);strcat(buff,"你好111");write(newfd,buff,res);}return 0;
}

简易客户端:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if(connect(oldfd,(struct sockaddr *)&client,&client_len) == -1){perror("connect");return -1;}printf("与服务器建立连接成功\n");//3.收发消息char buff[1024];while(1){fget(buff,sizeof(buff),stdin);write(oldfd,buff,sizeof(buff));read(newfd,buff,sizeof(buff));printf("收到客户端信息:%s\n",buff);bzero(buff,sizeof(buff));}return 0;
}

jTCP服务器:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{//1.创建套接字int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//端口号快速复用int n = 2;if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n)) == -1){perror("setsockopt");return -1;}//2.绑定本机IP和端口号struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("bind");return -1;}//3.监听客户端请求if(listen(oldfd,10) == -1) //监听10个客户端{perror("listen");return -1;}struct sockaddr_in client;int client_len = sizeof(client);  //addr_t 就是intint newfd;//4.接收客户端连接请求if((newfd = accept(oldfd,(struct sockaddr *)&client,&client_len))==-1){perror("accept");return -1;}printf("%s:%d连接\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));//5.收发消息char buff[1024];while(1){int res = recv(newfd,buff,sizeof(buff),0);if(res == 0){printf("客户端退出\n");break;}printf("接收到信息:%s,接收到信息的长度:%d\n",buff,res);strcat(buff,"追加一个666");send(newfd,buff,sizeof(buff),0);     //阻塞发送信息bzero(buff,sizeof(buff));}close(oldfd);close(newfd);return 0;
}

TCP客户端:

#include<myhead.h>
#define IP "192.168.191.129"
#define PORT 1234
#define SERPORT 6666int main(int argc, const char *argv[])
{//1.创建套接字int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//2.绑定客户端struct sockaddr_in client = {.sin_family = AF_INET,.sin_port = htons(PORT), //自定义的端口号.sin_addr.s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&client,sizeof(client)) == -1){perror("bind");return -1;}//3.连接服务器,填充服务器信息struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(SERPORT), //这里端口号需要服务器端口号.sin_addr.s_addr = inet_addr(IP)};if(connect(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("connect");return -1;}//4.发送和接收char buff[1024];while(1){fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1] = '\0';send(oldfd,buff,strlen(buff),0);if(strcmp(buff,"quit") == 0)      //退出客户端{break;}bzero(buff,sizeof(buff));recv(oldfd,buff,sizeof(buff),0);     //阻塞接收服务器消息printf("服务器发来消息:%s\n",buff);}return 0;
}

UDP

UDP服务器:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{//1.创建UDP套接字int oldfd = socket(AF_INET,SOCK_DGRAM,0);if(oldfd == -1){perror("socket");return -1;}//2.绑定struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr .s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("bind");return -1;}//收发消息struct sockaddr_in client;int client_len = sizeof(client);char buff[1024];while(1){//接受客户端消息时会将客户短信息写入clientrecvfrom(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&client,&client_len);printf("收到%s:%d的消息:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buff);strcat(buff,"追加10086今天是周六");sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&client,sizeof(client)); //收到谁的信息就发给谁}return 0;
}

UDP客户端:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{//1.创建套接字int oldfd = socket(AF_INET,SOCK_DGRAM,0);if(oldfd == -1){perror("socket");return -1;}//2.收发消息struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};char buff[1024];while(1){fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1] = '\0';sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&server,sizeof(server));bzero(buff,sizeof(buff));recvfrom(oldfd,buff,sizeof(buff),0,NULL,NULL);printf("接收服务器信息:%s\n",buff);}return 0;
}

练习

在UDP服务器中,使用connect函数,实现唯一的客户端与服务器通话

#include <myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main() {// 创建UDP socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1){perror("socket");return -1;}// 设置服务器地址struct sockaddr_in server_addr{.sin_family = AF_INET,.sin_port = htons(12345),.sin_addr.s_addr = inet_addr(IP)};// 绑定服务器地址到socketif (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){perror("bind");return -1;}// 接收和发送数据char buffer[1024];struct sockaddr_in client_addr;socklen_t addr_len = sizeof(client_addr);// 等待客户端连接if (connect(sockfd, (struct sockaddr *)&client_addr, addr_len) == -1){perror("connect");return -1;}// 与客户端通信while (1){memset(buffer, 0, sizeof(buffer));printf("等待客户端的消息:\n");ssize_t recv_len = recvfrom(sockfd, (char *)buffer, MAX_BUF_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);if (recv_len == -1){perror("recvfrom");return -1;}printf("接收到客户端消息%s\n", buffer);// 将收到的消息原样发送回客户端ssize_t send_len = sendto(sockfd, (const char *)buffer, strlen(buffer), 0, (const struct sockaddr *)&client_addr, addr_len);if (send_len == -1){perror("sendto");return -1;}}// 关闭socketclose(sockfd);return 0;
}

http://www.lryc.cn/news/511755.html

相关文章:

  • 声波配网原理及使用python简单的示例
  • 深度学习任务中的 `ulimit` 设置优化指南
  • 【学生管理系统】权限管理
  • Java编程题_面向对象和常用API01_B级
  • JUC并发工具---线程协作
  • Excel for Finance 08 `XNPV`和`XIRR` 函数
  • 嵌入式入门Day35
  • AE/PR/达芬奇模板:自动光标打字机文字标题移动效果动画模板预设
  • RCE漏洞
  • 在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题
  • 【Compose multiplatform教程20】在应用程序中使用多平台资源
  • 深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
  • 紫光同创-盘古200pro+开发板
  • iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针
  • 【优选算法】有效三角形的个数(双指针算法)
  • 中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern)
  • 客户案例:基于慧集通打通聚水潭电商ERP与用友U8系统集成之路
  • 阿里云clb是什么
  • 【Cursor编辑器】自用经验和实操(迭代更新)
  • 【学习笔记】ChatGPT原理与应用开发——基础科普
  • 基于Web的实验中心工作管理网站的设计与实现
  • docker 安装minio
  • ubuntu下ipmi的使用(4028)
  • 周记-唐纳德的《计算机程序设计艺术》
  • 极品飞车6的快捷键与车辆等级
  • 计算机毕业设计Python+知识图谱大模型AI医疗问答系统 健康膳食推荐系统 食谱推荐系统 医疗大数据 机器学习 深度学习 人工智能 爬虫 大数据毕业设计
  • 纯真社区版IP库CZDB数据格式使用教程
  • Linux(Centos 7.6)软件包安装
  • [WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同
  • 【畅购商城】微信支付之支付模块