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

objectivec 复制代码
#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结构体 sin
        bzero(&sin,sizeof(sin));//将结构体所有内容设置为0
        sin.sin_family = AF_INET;//定义结构体的sin_family为ipv4类型AF_INET
        sin.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内容全部置0
                if(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
    提供无连接服务器,数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重
    复,顺序发送,可能乱序接收。
  2. 原始套接字( 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地址+端口号 来决定的
相关推荐
2501_928996224 分钟前
Agent 开发的 API 选型:从 Function Calling 到多模型协作的中科热备底层逻辑
服务器·重构·gitlab
雯宝21 分钟前
7. USB 网络适配器驱动
linux
星恒讯工业路由器23 分钟前
房车旅居不“断网”:移动生活如何实现全程在线?
网络·物联网·生活·工业路由器·车载工业路由器·房车通信·双卡备份
rest102437 分钟前
使用内存探测bpf
linux
重生之我来学Python1 小时前
Docker套装的简介、安装、超级详细教程
linux·docker·容器·eureka·github
非凡ghost1 小时前
AI修图不“造假“,摄影师的出片效率加速器
服务器·前端·人工智能·电脑
和裕1 小时前
光伏储能定制加强型瓦楞纸箱:降低组件运输隐裂率与售后损耗的核心价值
大数据·运维·网络·人工智能·算法
Ruiery2 小时前
Linux 6.6内核 PCIe 深度解析(十):PCIe Port Driver(portdrv)— 一个物理 Port,拆出五个逻辑服务
linux·运维·服务器
乐维_lwops2 小时前
网管系统:流量分析如何用“五元组”+“TOPN”透视网络异常?
网络·流量分析·网管系统
Multipath7122 小时前
乾元通基于原生UDP时隙感知的多链路聚合方案
网络·网络协议·5g·安全·udp·智能路由器·实时音视频