简陋的服务端代码

#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
//#include<linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
//127.0.0.1,它是一个特殊IP地址,表示本机地址
//sockaddr中包含了地址、端口和IP地址的信息。在进行地址绑定的时候,需要弦将地址结构中的IP地址、端口
//类型等结构struct sockaddr中的域进行设置之后才能进行绑定,这样进行绑定后才能将套接字文件描述符与地址等接合在一起。
int main()
{
    int n_read;
    char readBuf[128];
    char *str = "I get your message\n";
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
    memset(&s_addr,0,sizeof(struct sockaddr_in));//结构体变量初始化
    memset(&c_addr,0,sizeof(struct sockaddr_in));
    //1 sockte int socket(int domain, int type, int protocol);
    int s_fd;//服务端的文件描述符
    int c_fd;//客户端的文件描述符
    s_fd = socket(AF_INET,SOCK_STREAM,0);//创建套接字第一个参数代表ipv4,第二个是选择链接协议,第三个默认0系统自动选择用什么协议
    if(s_fd == -1)
    {
        perror("socket");
        exit(-1);
    }

        s_addr.sin_family = AF_INET;//在sockaddr结构体中赋值使用ipv4网络
        s_addr.sin_port = htons(8989);//设置链接端口号
    //inet_aton("127.0.0.1",&s_addr.sin_addr);
    //2 bind int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    inet_aton("172.27.84.213",&s_addr.sin_addr);//转义将字符串的ip地址添加到结构体队接受ip地址的对应变量
    //这里计算机并不认识字符串写的ip地址是什么意思,需要用inet_aton转换成ascii 系统认识的ip地址

    bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
    //绑定函数 1:服务端的文件描述符。2:指向一个结构为sockaddr参数的指针,sockaddr中包含了地址、端口和IP地址的信息。
    //在进行地址绑定的时候,需要将地址结构中的IP地址、端口、类型等
    //结构struct sockaddr中的域进行设置之后才能进行绑定,这样进行绑定后才能将套接字文件描述符与地址等接合在一起。
    //先将s_addr的地址拿到在转成对应的结构体类型的指针
    //3:需要绑定的长度
    //3 listen
    listen(s_fd,10);//监听端口,监听10个链接请求
    //4 accept
    int clen = sizeof(struct sockaddr_in);
    c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
    //accept函数指定服务端去接受客户端的连接接收后,返回了客户端套接字的标识,且
    //获得了客户端套接字的“地方”(包括客户端IP和端口信息等)。
    //第二个参数是一个结构体型的指针用来接受客户端的各种ip端口等信息。
    //第三个参数是接受结构体的大小为什么不能写里面是函数原型的问题,里面必须是地址没得办法
    while(1)
    {
    if(c_fd == -1)
    {
        perror("accept");
    }
    printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));//将客户端的ip转成字符串人能看懂
    //inet_ntoa函数就是将ip地址进行相互转换成人或机器能识别的地址
    //5 read
    n_read = read(c_fd,readBuf,128);//从客户端读数据到缓冲区读128字节
        if(n_read == -1)
    {
        perror("read");
       
    }else
    {
        printf("get message:%d,%s\n",n_read,readBuf);
    }  

    //6 write

    write(c_fd,str,strlen(str));//将字符串写道客户端,返回代表传输成功

    }

    return 0;
}
posted @   信号编程好难  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示