服务器搭建(TCP套接字)-基础版(客户端)

在这里插入图片描述

一、socket

在这里插入图片描述

1.1、vim man查看socket

:!man socket

在这里插入图片描述
在这里插入图片描述

1.2、 依赖的头文件

 #include <sys/types.h>     #include <sys/socket.h>

1.3、原型

int socket(int domain, int type, int protocol);
domain说明
AF_INETIPV4协议
AF_INET6IPV6协议
AF_LOCALUnix域协议
type说明
SOCK_STREAM字节流套接字(TCP/SCTP)
SOCK_DGRAM数据报套接字(UDP)
SOCK_RAM原始套接字 (IPv4/IPv6)
SOCK_SEQPACKET有序分组套接字(SCTP)
protocol说明
IPPROTO_CPTCP传输协议
IPPROTO_UDPUDP传输协议
IPPROTO_SCTPSCTP传输协议

socket函数在成功时会返回一个小的非负整数值,它与文件描述符类似,就称它为套接字描述符。只需要指定协议族(IPV4、IPV6或Unix)和套接字类型即可

  • 代码实现
socket_fd=socket(AF_INET,SOCK_STREAM,0);

二、connect

在这里插入图片描述

2.1、原型

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

connect() 函数用于在客户端应用程序中与服务器建立连接。需要注意的是,connect() 函数可能会阻塞,直到连接成功建立或发生错误。因此,您可以使用适当的超时机制或非阻塞 Socket 设置来控制连接过程的行为。

入参:

  • sockfd:要连接的客户端 Socket 的文件描述符。
  • addr:指向服务器地址结构的指针,其中包含服务器的 IP 地址和端口号。
  • addrlen:服务器地址结构的长度。

返回值:

  • 0 表示连接成功
  • 返回值为 -1 表示连接失败,并设置相应的错误代码(可以使用 perror() 函数打印错误信息)。

2.2、代码

#define SERVER_PORT 8596 
#define MESSAGE_LENGTH 1024int ret = -1;
int socket_fd;
//server addr
struct sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
serverAddr.sin_addr.s_addr = inet_addr(args[1]);
if(connect(socket_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){perror("connect error");return 1;
}

三、send

在这里插入图片描述

3.1、原型

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

send 是一个在网络编程中使用的函数,用于发送数据到已连接的套接字或发送数据报套接字中。

入参:

  • sockfd:整型参数,表示要发送数据的套接字的文件描述符。
  • buf:指向要发送数据的缓冲区的指针。
  • len:无符号整型参数,表示要发送数据的长度。
  • flags:整型参数,用于指定发送操作的可选标志。常见的标志包括 0(无特殊标志)和 MSG_DONTWAIT(非阻塞模式发送)等。

返回值

  • 如果成功发送数据,send 返回发送的字节数。
  • 如果连接关闭(对于流套接字)或发送超时(对于数据报套接字),send 返回 0。
  • 如果发生错误,send 返回 -1,并设置相应的错误码,可以通过 errno 全局变量获取具体的错误信息。

3.2、源码

#define MESSAGE_LENGTH 1024char sendbuf[MESSAGE_LENGTH];while(1){memset(sendbuf, 0, MESSAGE_LENGTH);printf("send message:");fgets(sendbuf,MESSAGE_LENGTH,stdin);//printf("\n");ret = send(socket_fd, sendbuf, strlen(sendbuf), 0);if(ret <= 0 ){printf("the connection is disconnection!\n");break;}}

四、recv

在这里插入图片描述

4.1、原型

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

recv 是一个在网络编程中使用的函数,用于接收数据从已连接的套接字或接收数据报套接字中。

需要注意的是,recv 函数是一个阻塞调用,即在没有数据到达之前,它会一直等待。如果需要非阻塞的操作,可以使用非阻塞 I/O 或多线程/多进程的方式处理接收操作。

入参:

  • sockfd:整型参数,表示要接收数据的套接字的文件描述符。
  • buf:指向接收数据缓冲区的指针,用于存储接收到的数据。
  • len:无符号整型参数,表示接收数据缓冲区的长度。
  • flags:整型参数,用于指定接收操作的可选标志。常见的标志包括 0(无特殊标志)、MSG_DONTWAIT(非阻塞模式接收)和 MSG_WAITALL(阻塞模式接收,直到接收到指定长度的数据)等。

返回值:

  • 如果成功接收数据,recv 返回接收到的字节数。
  • 如果连接关闭(对于流套接字)或接收超时(对于数据报套接字),recv 返回 0。
  • 如果发生错误,recv 返回 -1,并设置相应的错误码,可以通过 errno 全局变量获取具体的错误信息。

五、完整代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>#include <errno.h>
#include <netdb.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define SERVER_PORT 8596 
#define MESSAGE_LENGTH 1024int main(int argc,char* args[])
{int ret = -1;int socket_fd;//server addrstruct sockaddr_in serverAddr;char sendbuf[MESSAGE_LENGTH];char recvbuf[MESSAGE_LENGTH];int data_len;if((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);//inet_addr()函数,将点分十进制IP转换成网络字节序IPserverAddr.sin_addr.s_addr = inet_addr(args[1]);if(connect(socket_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){perror("connect");return 1;}printf("success to connect server...\n");while(1){memset(sendbuf, 0, MESSAGE_LENGTH);printf("send message:");fgets(sendbuf,MESSAGE_LENGTH,stdin);//printf("\n");ret = send(socket_fd, sendbuf, strlen(sendbuf), 0);if(ret <= 0 ){printf("the connection is disconnection!\n");break;}if(strcmp(sendbuf, "quit") == 0){break;}printf("receive message:");recvbuf[0] = '\0';data_len = recv(socket_fd, recvbuf, MESSAGE_LENGTH, 0);recvbuf[data_len] = '\0';printf("%s\n", recvbuf);}close(socket_fd);return 0;}

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

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

相关文章

GDPU 数据结构 天码行空2

实验内容 用顺序表实现病历信息的管理与查询功能。具体要求如下: 利用教材中定义顺序表类型存储病人病历信息(病历号,姓名&#xff0c;症状)&#xff1b;要求使用头文件。 设计顺序表定位查找算法&#xff0c;写成一个函数&#xff0c;完成的功能为:在线性表L中查找数据元素x…

MATLAB中ilu函数用法

目录 语法 说明 示例 不同类型的不完全 LU 分解 不完全 LU 分解的调降容差 使用 ilu 作为预条件子来求解线性系统 ilu函数的功能是对矩阵进行不完全 LU 分解。 语法 [L,U] ilu(A) [L,U,P] ilu(A) W ilu(A) [___] ilu(A,options) 说明 [L,U] ilu(A) 用零填充执行…

前端框架vBean admin

文章目录 引言I 数据库表设计1.1 用户表1.2 角色表1.3 菜单表II 接口引言 文档:https://doc.vvbin.cn/guide/introduction.html http://doc.vvbin.cn 仓库:https://github.com/vbenjs/vue-vben-admin git clone https://github.com/vbenjs/vue-vben-admin-doc 在线体验demo:…

【前段基础入门之】=>初识 HTML

文章目录 前言HTML的详情简介HTML 发展史HTML 入门1. HTML 标签元素2. HTML标签属性3. HTML的标准结构 总结 前言 在整个前端开发中&#xff0c;必须掌握的技术栈为&#xff1a; HTML &#xff0c;CSS&#xff0c;JavaScript&#xff0c;它们三者&#xff0c;共同组成了前端开发…

JavaEE学习之--类和对象

&#x1f495;粗缯大布裹生涯&#xff0c;腹有诗书气自华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java学习之--类和对象 类和对象 类的实例化&#xff1a; 1.什么叫做类的实例化 利用类创建一个具体的对象就叫做类的实例化&#xff01; 当我们创建了…

简单的手机电脑无线传输方案@固定android生成ftp的IP地址(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server 高级:固定android设备IP准备检查模块是否生效 windows 访问ftp服务器快捷方式命令行方式双击启动方式普通快捷方式映射新的网络位…

Kindle电子书下载功能关闭怎么办,借助calibre和cpolar搭建私有的网络书库公网访问

Kindle中国电子书店停运不要慌&#xff0c;十分钟搭建自己的在线书库随时随地看小说&#xff01; 文章目录 Kindle中国电子书店停运不要慌&#xff0c;十分钟搭建自己的在线书库随时随地看小说&#xff01;1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网…

竞赛选题 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

案例丨如何提升可视化分析能力?听听这两家企业怎么说

神策分析 2.5 版本正式发布经营分析能力以来&#xff0c;已有不少客户接入使用&#xff0c;并充分实现了可视化分析能力的提升。 本文将为大家分享两家客户的真实反馈&#xff0c;希望能够帮助您进一步了解神策经营分析的能力。 案例一&#xff1a;神策数据助力美篇打造公司级“…

基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】

俄罗斯方块&#xff0c;一款起源于上世纪80年代的经典电子游戏&#xff0c;凭借简单的规则和独特的魅力&#xff0c;一跃成为全球家喻户晓的经典。你知道其实只需要一些基础的编程知识&#xff0c;就可以自己实现它吗&#xff1f;今天&#xff0c;我们将使用Python的Pygame库&a…

第八天:gec6818arm开发板和Ubuntu中安装并且编译移植mysql驱动连接QT执行程序

一、Ubuntu18.04中安装并且编译移植mysql驱动程序连接qt执行程序 1 、安装Mysql sudo apt-get install mysql-serverapt-get isntall mysql-clientsudo apt-get install libmysqlclient-d2、查看是否安装成功&#xff0c;即查看MySQL版本 mysql --version 3、MySQL启动…

有了Spring为什么还需要SpringBoot呢

目录 一、Spring缺点分析 二、什么是Spring Boot 三、Spring Boot的核心功能 3.1 起步依赖 3.2 自动装配 一、Spring缺点分析 1. 配置文件和依赖太多了&#xff01;&#xff01;&#xff01; spring是一个非常优秀的轻量级框架&#xff0c;以IOC&#xff08;控制反转&…

@DateTimeFormat 和 @JsonFormat 的详细研究

关于这两个时间转化注解&#xff0c;先说结论 一、介绍 1、DateTimeFormat DateTimeFormat 并不会根据得到其属性 pattern 把前端传入的数据转换成自己想要的格式&#xff0c;而是将前端的String类型数据封装到Date类型&#xff1b;其次它的 pattern 属性是用来规范前端传入…

python每日一题(模拟用户登录验证)

1、题目 预先设定正确用户名与密码&#xff0c;用来验证用户是否登录成功。 第一次&#xff1a; ① 输入用户名与密码&#xff0c;如果用户名与密码正确&#xff0c;则提示登录成功&#xff1b; ② 如果用户名错误&#xff08;不管密码是否正确&#xff09;&#xff0c;则需要重…

TOGAF架构开发方法—初步阶段

本章描述了满足新企业体系结构业务指令所需的准备和启动活动,包括组织特定体系结构框架的定义和原则的定义。 一、目标 初步阶段的目标是: 确定组织所需的体系结构功能: 审查进行企业架构的组织背景确定受体系结构功能影响的企业组织的元素并确定其范围确定与架构功能相交的…

10分钟设置免费海外远程桌面

前言 本教程将向您介绍如何使用 Amazon Lightsail 服务的免费套餐轻松搭建属于您的远程桌面。依托于 Amazon 全球可用区&#xff0c;您可以在世界各地搭建符合您配置需求的远程桌面。 本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐…

北工大汇编——综合题(2)

题目要求 编写一个比赛得分程序。共有7 个评委&#xff0c;按百分制打分&#xff0c;计分 原则是去掉一个最高分和一个最低分&#xff0c;求平均值。要求&#xff1a; 评委的打分以十进制从键盘输入。成绩以十进制给出&#xff0c;并保留 1位小数。输入输出时屏幕上要有相应提…

基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

代码随想录算法训练营第二天(C) | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

文章目录 前言一、977.有序数组的平方二、209.长度最小的子数组三、59.螺旋矩阵总结 前言 java版&#xff1a; 代码随想录算法训练营第二天 | 977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵_愚者__的博客-CSDN博客 一、977.有序数组的平方 …

python实现命令tree的效果

把所有的文档都传到了git上,但是内容过多找起来不方便,突发奇想如果能在readme中,递归列出所有文件同时添加上对应的地址,这样只需要搜索到对应的文件点击就能跳转过去了… 列出文件总得有个显示格式,所以就按照tree的来了… 用python实现命令tree的效果 首先,这是tree的效果…