当前位置: 首页 > 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.lryc.cn/news/621236.html

相关文章:

  • 【22-决策树】
  • 零基础-动手学深度学习-10.3. 注意力评分函数
  • 20道CSS相关前端面试题及答案
  • torch.nn中Sequential的使用
  • 【代码随想录day 20】 力扣 538.把二叉搜索树转换为累加树
  • CMake语法与Bash语法的区别
  • 扩展用例-失败的嵌套
  • 流式数据服务端怎么传给前端,前端怎么接收?
  • jenkins在windows配置sshpass
  • 设计模式笔记_行为型_状态模式
  • 【JavaEE】多线程 -- 线程状态
  • 纸箱拆垛:物流自动化中的“开箱密码”与3D视觉的智能革命
  • 面试题之项目中灰度发布是怎么做的
  • Flink on YARN启动全流程深度解析
  • 会议通信系统核心流程详解(底稿1)
  • Linux软件编程:进程和线程
  • C#面试题及详细答案120道(01-10)-- 基础语法与数据类型
  • Flink Stream API 源码走读 - socketTextStream
  • 2025H1手游市场:SLG领涨、休闲爆发,何为出海新航道?
  • 广告灯的左移右移
  • Day43 复习日
  • FPGA+护理:跨学科发展的探索(五)
  • Kotlin Data Classes 快速上手
  • 【深度学习】深度学习基础概念与初识PyTorch
  • 报数游戏(我将每文更新tips)
  • IPTV系统:开启视听与管理的全新篇章
  • 14 ABP Framework 文档管理
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线
  • SpringMVC(详细版从入门到精通)未完
  • P5967 [POI 2016] Korale 题解