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

LINUX客户端client(socket、connect,write)实现客户端发送,服务器接收

SERVICE端见前一篇文章
5. 客户端连接函数 connect()(与前面的bind一样)
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen)
参数:
sockfd: 通过 socket() 函数拿到的 fd
addr:struct sockaddr 的结构体变量地址
addrlen: 地址长度
返回值:
成功,返回 0
失败,返回 -1

#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include<stdlib.h>
#include <strings.h>
#include<unistd.h>#include <string.h>#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>#define SERV_PORT 5001
#define SERV_IP_ADDR "192.168.157.34"
#define BUFSIZE 1024
#define QUIT_STR "QUIT"int main()
{int fd = -1;//首先将文件描述符设置为-1,-1为socket()出错时返回的值fd = socket(AF_INET,SOCK_STREAM,0);if(fd<0)//如果socket返回值出错,则报错,异常退出{perror("socket");exit(1);}struct sockaddr_in sin;//定义一个socketaddr结构体 sinbzero(&sin,sizeof(sin));//将结构体所有内容设置为0sin.sin_family = AF_INET;//定义结构体的sin_family为ipv4类型AF_INETsin.sin_port = htons(SERV_PORT);//定义端口号,并由主机字节序转换为网络字节序sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR);//定义Ip地址,转为网络字节序的ip地址if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))<0)//连接,用法类似服务器的绑定函数bind,如果connect出错,返回-1,报错,异常退出,用于连接服务器{perror("connect");exit(1);}char buf[BUFSIZE];//定义一个字符串类型的buf,大小为宏定义SIZEBUF大小while(1)//一直循环{bzero(buf,sizeof(buf));//将buf内容全部置0if(fgets(buf,BUFSIZE-1,stdin)==NULL)//从stdin标准输入获取BUFSIZE-1长度放到buf里面,如果stdin为NULL没有输入,就一直跳到while(1),继续执行while里面的内容,直到stdin有输入{continue;}write(fd,buf,strlen(buf));、//将获取到的buf内容写到文件描述符fd中if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))//比较Buf中的内容和宏定义QUIT_STR的内容QUIT,如果相同,返回0,取反为1,则终止while循环{break;}}
return 0;
}

打开两个终端,先运行服务器

在运行客户端

然后在客户端发送数据,服务器接收数据

关于socket的简介

7. 网络预备知识
1.socket
是一个编程接口,是一个特殊的文件描述符(对他执行IO的操作函数,比如read,write,close等),并不仅限于TCP/IP协议,面向连接TCP,连接UDP
socket 代表网络编程的一种资源
分类
1. 流式套接字(SOCK_STREAM)。唯一对应TCP
提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送顺序接收。内射击流量控
制,避免数据流淹没慢的接收方。数据被看作式字节流,无长度限制。
2.数据包套接字(SOCK_DGRAM)。唯一对应UDP
提供无连接服务器,数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重
复,顺序发送,可能乱序接收。
3. 原始套接字( SOCK_RAW )。对应多个协议,发送穿透了传输层
可以对较低层次协议如 IP ICMP 直接访问。
2.IP地址IP地址是Internet中主机的标识,Internet中的主机要与别的机器通信必须具有一个IP地址,IP地址为32 为(Ipv4)或者128位(Ipv6 ,每个数据包都必须携带目的 IP 地址和源 IP 地址,路由器依靠此信息为数据包选择路由
表示的形式:常用点分形式,如 202.38.64.10 ,最后都会转化成一个 32 位的无符号整数
mobileIPV6:local IP (本地注册的 IP ), roma IP( 漫游 IP)
特殊 IP 地址
局域网 IP 192.XXX.XXX.XXX 10.XXX.XXX.XXX
广播 IP xxx.xxx.xxx.255 255.255.255.255( 全网广播 ) 网络风暴
组播 IP 224.xxx.xxx.xxx ~239.xxx.xxx.xxx
3. 端口号
16 位数字, 1-65535
为了区分一台主机接收到的数据包应该转交给哪个任务进程处理,使用端口号来区别
预留端口, 1-1023 FTP:24, SSH:22, HTTP: 80 ,HTTPS :469
保留端口:1024-5000(不建议使用)
可以使用的端口: 5000~65535
TCP 端口号于 UDP 端口号独立
网络里的通信是由 IP地址+端口号 来决定的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Docker 镜像 pull 失败(Docker 镜像停止服务解决方法)
  • 第124天:内网安全-代理 Sockets协议路由不出网后渗透通讯CS-MSF 控制上线
  • 无人机之在农业上的用途
  • Java毕业设计-基于SSM框架的少儿编程网上报名系统项目实战(附源码+论文)
  • tensorboard add_text() 停止自动为尖括号标记添加配对的结束括号</>
  • 基于 HTML+ECharts 实现的数据可视化大屏案例(含源码)
  • 云HIS系统源码,业务云协同和数据云协同的数字化医院信息系统
  • 源码拆解SpringBoot的自动配置机制
  • hdfs命令
  • 采集PCM,将base64片段转换为wav音频文件
  • RuoYi-Vue 全新 Pro 版本:清除url地址栏路由参数
  • mysql面试(四)
  • vue 搜索框
  • 【Linux】gcc简介+编译过程
  • VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器
  • 时间复杂度分析经典问题——最大子序列和
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Fundebug计费标准解释:事件数是如何定义的?
  • github从入门到放弃(1)
  • JavaScript设计模式之工厂模式
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PAT A1120
  • react 代码优化(一) ——事件处理
  • Redis字符串类型内部编码剖析
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SQLServer插入数据
  • Theano - 导数
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 初识 webpack
  • 从0实现一个tiny react(三)生命周期
  • 从零开始的无人驾驶 1
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 讲清楚之javascript作用域
  • 排序算法学习笔记
  • 前端临床手札——文件上传
  • 算法系列——算法入门之递归分而治之思想的实现
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 我这样减少了26.5M Java内存!
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • kubernetes资源对象--ingress
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #100天计划# 2013年9月29日
  • #Ubuntu(修改root信息)
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)Hilt的基本概念和使用
  • (11)MATLAB PCA+SVM 人脸识别
  • (C语言)逆序输出字符串
  • (翻译)terry crowley: 写给程序员
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...