linux网络编程之tcp

news2024/12/27 0:59:49

相关函数

int socket(int domain,int type,int protocol);

参数:
domain:
AF_INET
AF_INET6
AF_UNIX,AF_LOCAL
AF_NETLINK
AF_PACKET
type:
SOCK_STREAM: 流式套接字,唯一对应于TCP
SOCK_DGRAM:数据报套接字,唯一对应着UDP
SOCK_RAW:原始套接字
protocol:
一般填0,原始套接字编程时需填充
返回值
成功返回文件描述符
出错返回-1
如果是IPV6编程,要使用struct sockddr_in6结构体(man 7 IPV6),通常使用struct sockaddr_storage来编程。

int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

参数
sockfd:通过socket()函数拿到的fd
addr:采用struct sockaddr的结构体地址,通用结构体
struct sockaddr{
sa_family_t sa_family;
char sa_data[4];
}
struct sockaddr_in{ 基于Internel通信结构体
as_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
sin_zero , //填充字节,需清零
}
struct in_addr{
uint32_t s_addr;
}
addrlen:地址长度

int listen(int sockfd,int backlog);

参数:
sockfd: 通过socket()函数拿到的fd;
backLog:同时允许几路客户端和服务器进行正在连接的过程(正在三次握手),一般填5。

返回值:
成功返回0
出错返回-1
listen(fd,5);//表示系统允许11(2*5+1)个客户端同时进行三次握手

阻塞等待客户端连接请求
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数
sockfd:经过前面socket()创建并通过bind(),listen()设置过的fd
addr:指向存放地址信息的结构体的首地址
获取客服端IP地址和端口号
addrlen:存放地址信息的结构体的大小
返回值
成功,返回返回已经建立连接的新的newfd
出错,返回-1

int connect (int sockfd, struct sockaddr * serv_addr, int addrlen)

参数:
sockfd

文章目录

  • TCP服务端实现步骤:
    • TCP服务端代码
  • TCP 客户端实现步骤:
    • TCP 客户端代码
      • 执行结果

TCP服务端实现步骤:

1.socket函数创建一个(监听)套接字
2.bind函数给套接字绑定地址(IP + Port)。即给套接字提高网络连接路口
3.listen函数将套接字设置为监听状态,相当于将手机设置为待机状态。调用listen 函数实现。
4.accept函数阻塞接收客户端连接。
5.收发数据,调用 send/write 和 recv/read 函数实现。
6.调用 close 函数实现关闭客服端连接。

TCP服务端代码

tcp_ser.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>


#define SERV_PORT 8888
#define SERV_IP_ADDR "192.168.11.128"
#define BACKLOG 5
#define BUFSIZE 1024
#define QUIT_STR "QUIT"
int main()
{
        int sockfd;
    //1.创建套接字
        sockfd=socket(AF_INET,SOCK_STREAM,0);
        if(sockfd<0)
        {
                perror("socket");
                exit(1);
        }
    //2.给套接字绑定地址
        struct sockaddr_in myaddr;
        //清零myaddr结构体里的数据
        bzero(&myaddr,sizeof(myaddr));
        //初始化myaddr结构体
        myaddr.sin_family=AF_INET;   //协议簇
        myaddr.sin_port=htons(SERV_PORT); //指定端口,主机字节序转换为网络字节序
        myaddr.sin_addr.s_addr=inet_addr(SERV_IP_ADDR);//指定IP地址,将字符串转为无符号整型
        //inet_pton(AF_INET,SERV_IP_ADDR,(void *)myaddr.sin_addr_s_addr);

        int ret=bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
        if(ret ==-1)
        {
                perror("bind");
                exit(2);
        }
   //3.使套接字能够监听,能够被其他客服端连接
        int res_lis=listen(sockfd,BACKLOG);
 if(res_lis==-1)//表示系统允许11(2*5+1)个客户端同时进行三次握手
        {
                perror("listen");
                //exit(3);
        }
        char buff[BUFSIZE];


   //4.阻塞等待接受客服端连接
        struct sockaddr_in saddr;
        bzero(&saddr,sizeof(saddr));
        //等待连接
        socklen_t length = sizeof(saddr);
        int newfd=accept(sockfd,(struct sockaddr *)&saddr,&length);
        if(newfd<0)
        {
                perror("accept");
                exit(5);
        }
        while(1)
        {
                        memset((void *)buff,0,1024);
                        int ret2=read(newfd,buff,sizeof(buff));
                        if(ret2<=0)
                        {
                                break;
                        }
                         /*int ret2=recv(newfd,buff,BUFSIZE-1,0);
                         if(ret2==0)
                        {       
              break;
                        }*/

                         printf("receive data is %s\n",buff);
                //判断是否接受到的数据是不是QUIT_STR,是的话,就退出此次循环
                        if(!strncasecmp(buff,QUIT_STR,strlen(QUIT_STR)))
                        {
                                printf("client is exiting\n");
                                break;
                        }
        }
        close(newfd);


        close(sockfd);
        return 0;
}
                                                                                                                                                                                          

TCP 客户端实现步骤:

1.socket函数创建一个套接字。
2.(可以绑定也可以不绑定)bind函数给套接字绑定地址,如果没有绑定,系统将自动给套
接字分配地址。
3.connect函数连接服务器。
4.收发数据,调用 send/write 和 recv/read 函数实现。
5.close函数断开连接

TCP 客户端代码

tcp_cli.c

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <stdlib.h>

#define  SERV_PROT 8888
#define  SERV_IP_ADDR "192.168.11.128"
#define  BUFSZIE 1024
#define  QUIT_STR "QUIT"
int main()
{
        int sockfd;
        //1.创建一个套接字
        sockfd=socket(AF_INET,SOCK_STREAM,0);

        //2.不调bind函数来给套接字绑定地址,由系统自动分配
        //3.连接服务器件
        struct sockaddr_in saddr;
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(SERV_PROT);
        saddr.sin_addr.s_addr=inet_addr(SERV_IP_ADDR);
        if(connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr)) == -1)
        {
                perror("connect");
                exit(1);
        }
        char buffer[1024];
        while(1)
        {
                memset(buffer,0,1024);
                if(fgets(buffer,1024,stdin)==NULL)
                {
                        continue;
                }
                send(sockfd,buffer,sizeof(buffer),0);

                if(!strncasecmp(buffer,QUIT_STR,strlen(QUIT_STR)))
                {
                        break;
                 }
        }
        close(sockfd);
        return 0;
}

                                                       

执行结果

请添加图片描述
客户端向服务端发送数据,当发送数据为quit时,就服务端和客服端的连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第七章 MySQL体系结构、存储引擎、InnoDB、MyISAM、Memory、存储引擎特点及选择】

第七章 MySQL体系结构、存储引擎、InnoDB、MyISAM、Memory、存储引擎特点及选择 1.MySQL体系结构&#xff1a; ①连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连…

[Power Query] 日期和时间处理

Power Query查询编辑器为日期和时间数据提供了强大而快捷的处理方式 例1: 从日期中提取年、月份、日、季度、周、天等信息 数据源 步骤1:将数据源导入到Power BI Desktop&#xff0c;单击【转换数据】选项&#xff0c;进入Power Query查询编辑器界面 步骤2:选中"日期&qu…

【概念】数据仓库和数仓建模

数据仓库 数仓主要特征 面向主题&#xff1a;每个需求和表都属于一个主题&#xff0c;可以用主题来对数仓的表分门别类集成性&#xff1a;将异构数据源&#xff0c;比如MySQL和服务器埋点日志&#xff0c;统一转换成结构化的hive表数据存储到ODS层非易失性&#xff1a;对历史…

Flink系列文档-(YY12)-窗口计算

1 窗口基本概念 1.1 概述 窗口&#xff0c;就是把无界的数据流&#xff0c;依据一定规则划分成一段一段的有界数据流来计算&#xff1b; 既然划分成有界数据段&#xff0c;通常都是为了"聚合"&#xff1b; Keyedwindow重要特性&#xff1a;任何一个窗口&#xff0…

游戏开发36课 cocoscreator scrollview优化

在cocoscreator内&#xff0c;ScrollView控件封装的挺完美的了&#xff0c;不过对于一些对性能要求比较高的场景&#xff0c;会存在问题&#xff0c;以top100排行榜排行榜举例子 1、应用卡顿甚至崩溃 按照官方用例使用ScrollView&#xff0c;插入100个玩家的item&#xff0c;理…

离线安装harbor容器镜像仓库(harbor-v2.3.5)

记录&#xff1a;354 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;离线部署harbor容器镜像仓库集群&#xff0c;使用Redis为外部缓存、使用PostgreSQL为外部数据库、使用Ceph为共享存储、使用nginx为harbor的负载均衡、使用Keepalived为集群高可用、使用docker-ce操作…

【专业术语】(计算机 / 深度学习与目标检测 / 轨道交通)

专业术语-计算机 / 深度学习与目标检测 / 轨道交通一、 计算机1 IDE2 API3 CUDA Driver API3.1 cuInit - 驱动初始化3.2 关于context&#xff0c;有两种&#xff1a;3.3 CUcontext4 RuntimeAPI5 Memory5.1 关于内存&#xff0c;有两大类&#xff1a;5.1.1 CPU内存&#xff0c;称…

[附源码]Python计算机毕业设计Django考试系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

FISCO BCOS(二十五)———多机部署

一、基础环境搭建 1、查看当前是否安装了ssh-server服务 dpkg -l | grep ssh2、安装ssh-server服务 sudo apt-get install openssh-server3、修改配置文件"/etc/ssh/sshd_config" 4、重启openssh-server root@FISCOBCOS01:~# sudo /etc/init.d/ssh restart5、查看…

高数 |【2020数一真题】部分错题及经典题自用思路整理

T1:积分限与被积函数都等价为无穷小 T2:不连续一定不可导 T3:可微的定义 T4:收敛半径 T6:空间直线与向量 法一:

WINDOWS7-11磁盘分区教程

首先&#xff0c;打开计算机管理界面 以windows11为例&#xff0c;在任务栏搜索框内&#xff0c;输入“计算机管理界面” 点击打开。 然后选择存储-》磁盘管理 到这里之后&#xff0c;我们需要选中一个磁盘&#xff0c;压缩卷分出来一部分空间。为新分区做准备。 以E盘为例&a…

MapStruct与lombok加载顺序问题与annotationProcessorPaths的关系?

MapStruct是什么&#xff1f; MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach.——https://mapstruct.org/ 从官方定义来看&#xff0c;MapStruct类似于我…

C语言Socket编程,实现两个程序间的通信

文章目录server和client通信流程图实现两个程序间的通信1.服务端server2.客户端client3.怎么运行呢&#xff1f;4.重写代码已剪辑自: https://www.cnblogs.com/fisherss/p/12085123.html server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的…

17-JavaSE基础巩固练习:Math类API两道数学算法水题

两道算法水题&#xff08;一&#xff09; 一、判断质数 判断一个数是否为一个质数。 1、以前的写法 package com.app.demo26_math_api;public class Test1 {public static void main(String[] args) {/*判断n(任意整数)是否为一个质数&#xff1a;以前的写法:是用n对2~n之间…

JavaWeb Filter 过滤器

参考&#xff1a;JavaWeb过滤器(Filter)详解 1、简介 顾名思义就是对事物进行过滤的&#xff0c;在Web中的过滤器&#xff0c;当然就是对请求进行过滤&#xff0c;我们使用过滤器&#xff0c;就可以对请求进行拦截&#xff0c;然后做相应的处理&#xff0c;实现许多特殊功能。…

阿里云部署应用

安装jdk 查看已安装版本 rpm -qa | grep java yum命令查找JDK1.8软件包 yum -y list java-1.8* 安装列表中的JDK1.8软件包 yum -y install java-1.8.0-openjdk-devel.x86_64 java -version 配置环境变量 vim /etc/profile JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.…

三、内存管理 (二)虚拟存储器

目录 2.1虚拟内存的基本概念 2.2内存分配策略 2.2.1驻留集大小 2.2.2固定分配局部置换 2.2.3可变分配全局置换 2.2.4可变分配局部置换 2.3地址变换机构 2.3.1页表机制 2.3.2预调页策略和请求调页策略 2.3.3缺页中断机构 2.3.4对换区与文件区 2.3.5页面置换算法 …

搭建springWeb保姆级教程

经过我们对mybatis和spring框架的学习&#xff0c;我们即将要用框架进行前后端数据交互&#xff0c;已经脱离了那种用servlet的方式进行数据传输&#xff0c;今天让我们来搭建最基本的springweb框架&#xff01;&#xff01;&#xff01; 1.创建一个web项目 1. 2. 选择一个we…

自定义线程实现c++代码回调run方法

目录 pthread_create函数介绍 前面写过一篇文章《Thread类的start()方法创建线程的底层分析》&#xff0c;这次来自定义一个线程&#xff0c;并实现在底层创建内核线程来执行用户代码。 pthread_create函数介绍 在这之前&#xff0c;先熟悉下Linux中创建内核线程函数pthread…

【计算机视觉】 摄像机标定

摄像机标定 齐次坐标 齐次坐标&#xff0c;将欧氏空间的无穷远点&#xff0c;与投影空间中有实际意义的消失点&#xff0c;建立起映射关系。 把齐次坐标转化为笛卡尔坐标的方法&#xff1a;是前面n-1个坐标分量分别除以最后一个分量即可 一些解释和性质&#xff1a; 比较好的…