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

8.14网络编程——TCP通信基础

文章目录

  • 一、思维导图
  • 二、基于TCP通信的服务器端和客户端实现
    • 1、myhead.h
    • 2、服务器端
    • 3、客户端
  • 三、牛客网刷题

一、思维导图

思维导图

二、基于TCP通信的服务器端和客户端实现

1、myhead.h

#ifndef __MYHEAD_H__
#define __MYHEAD_H__#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>#define ERR_MSG(msg) do{perror(msg);printf("%d\n",__LINE__);return -1;}while(0)
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#endif

2、服务器端

#include <myhead.h>#define SER_PORT 8888
#define SER_IP "192.168.116.128"int main(int argc, const char *argv[])
{//创建一个用于连接的套接字文件描述符int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){ERR_MSG("socket error");}printf("socket success sfd=%d\n",sfd);//设置套接字属性:允许端口号快速重启int reuse=-1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){ERR_MSG("setsockopt error");}printf("端口快速重启成功\n");//给套接字绑定ip地址和端口号//封装地址信息结构体变量struct sockaddr_in sin;//地址信息结构体变量sin.sin_family=AF_INET;//通信域地址族sin.sin_port=htons(SER_PORT);//端口号网络字节序sin.sin_addr.s_addr=inet_addr(SER_IP);//ip地址网络字节序//绑定操作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("bind error");}printf("bind success\n");//将套接字启动监听if(listen(sfd,128)==-1){ERR_MSG("listen error");}printf("listen success\n");//阻塞客户端连接,如果有新的客户端连接,则创建一个用于通信的套接字struct sockaddr_in cin;//用于接受客户端套接字信息socklen_t addrlen=sizeof(cin);//用于接受客户端套接字的长度int new_fd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(-1==new_fd){ERR_MSG("accept error");}printf("[%s,%d]发来连接,new_fd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),new_fd);//使用新桃姐字和客户端进行通信while(1){//从套接字中读取消息char rbuf[128]="";//存放接受消息的容器int res=read(new_fd,rbuf,sizeof(rbuf)-1);if(res==0){printf("客户端已下线\n");close(new_fd);break;}if(res==-1){close(new_fd);close(sfd);ERR_MSG("read error");}printf("[%s,%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);//给消息加个笑脸返回strcat(rbuf,"*_*");//向套接字中写入消息write(new_fd,rbuf,strlen(rbuf));printf("发送成功\n");}//关闭监听套接字close(sfd);return 0;
}

3、客户端

#include <myhead.h>#define SER_PORT 8888
#define SER_IP "192.168.116.128"int main(int argc, const char *argv[])
{//创建一个用于连接的套接字文件描述符int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){ERR_MSG("socket error");}printf("socket success sfd=%d\n",sfd);//封装地址信息结构体变量struct sockaddr_in sin;//地址信息结构体变量sin.sin_family=AF_INET;//通信域地址族sin.sin_port=htons(SER_PORT);//端口号网络字节序sin.sin_addr.s_addr=inet_addr(SER_IP);//ip地址网络字节序//连接服务器if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("conect error");}printf("connect success\n");//数据收发while(1){char wbuf[128]="";//发送消息的容器fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';if(strcmp(wbuf,"quit")==0){break;}//将数据发给服务器write(sfd,wbuf,strlen(wbuf));printf("发送成功\n");//接受服务器发送的消息read(sfd,wbuf,sizeof(wbuf));printf("收到的消息为%s\n",wbuf);}//关闭套接字close(sfd);return 0;
}

三、牛客网刷题

在这里插入图片描述

http://www.dtcms.com/a/330821.html

相关文章:

  • 计算机视觉第一课opencv(二)保姆级教
  • WPF 实现TreeView选中项双向绑定保姆级教程:TreeViewHelper深度解析
  • MySQL缓存策略
  • 计算机视觉--opencv(代码详细教程)(二)
  • iPhone 17 系列发布会定于 9 月 9 日举行-邀请函或 9 月 2 日发出
  • MCP Server搭建
  • OpenCV中对图像进行平滑处理的4种方式
  • 微美全息(WIMI.US)借区块链与聚类技术,开启物联网去中心化安全架构新纪元
  • 我的第一个开源项目-jenkins集成k8s项目
  • .Net4.0 WPF中实现下拉框搜索效果
  • RabbitMQ高级特性——消息确认、持久性、发送方确认、重试
  • 解锁Prompt秘籍:框架、技巧与指标全解析
  • 基于Django的福建省旅游数据分析与可视化系统【城市可换】
  • 《量子雷达》第4章 量子雷达的检测与估计 预习2025.8.14
  • 【51单片机学习】定时器、串口、LED点阵屏、DS1302实时时钟、蜂鸣器
  • 量子人工智能
  • Python训练营打卡Day32-神经网络的训练
  • Swift 数据类型全景解析(基础到高阶)
  • 按位运算的枚举在 Swift 里如何实现?
  • 《吃透 C++ 类和对象(中):拷贝构造函数与赋值运算符重载深度解析》
  • 【数据分享】2014-2023年长江流域 (0.05度)5.5km分辨率的每小时日光诱导叶绿素荧光SIF数据
  • Pytest自动化测试框架总结
  • iOS性能监控新方法多版本对比与趋势分析实战指南
  • C++进阶:特殊类
  • 手写MyBatis第16弹:泛型魔法应用:MyBatis如何破解List的运行时类型
  • 笔试——Day38
  • 根据图片远程地址复制图片内容,可以在富文本、word等文本里粘贴
  • word——删除最后一页空白页
  • Exif.js获取手机拍摄照片的经纬度
  • 【网络】TCP/UDP总结复盘