代码先锋网 代码片段及技术文章聚合

网络---->socket,tcp服务器

技术标签: # 网络  # HTTP服务器 后端开发  # Linux  socket  服务器

tcp协议编程模型

  1. 创建 sockedFd socket网络套接字 fd文件描述符
    fd是个整数,可以代表网络端口
  2. 设置服务器协议簇
    确定服务器的ip与端口号
  3. 绑定
    将fd和协议簇绑定
  4. 监听
  5. 等待客户端连接
    服务器和客户端 之间有了一个稳定的数据传输通道
  6. 通信
    处理客户端请求
  7. 关闭socket
/*
 * 1.实现网络连接
 * 2.处理客户端请求
 */

#include<unistd.h>
#include<fcntl.h>//文件操作头文件
#include<arpa/inet.h>//网络相关头文件
#include<sys/socket.h>//socket

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//创建socked完成tcp前四步,并返回服务器fd
int initserver();

//处理客户端请求
void handclient(int fd);

int main()
{
        //1.实现连接
        int serverFd=initserver();
        //2.处理请求
        int clientfd;
        while(1)
        {
                //1.等待客户端连接
                clientfd=accept(serverFd,NULL,NULL);

                printf("有客户端连接服务器\n");
                //2.处理客户端请求
                handclient(clientfd);
                //3.close
                close(clientfd);
        }
        return 0;
        }

//1. 创建 sockedFd       socket网络套接字 fd文件描述符
//      fd是个整数,可以代表网络端口
//2. 设置服务器协议簇
//      确定服务器的ip与端口号
//3. 绑定
//      将fd和协议簇绑定
//4. 监听
int initserver()
{
        //1.
        int fd=socket(AF_INET,SOCK_STREAM,0);
        if(fd == -1){
                printf("创建socket失败:");
                return -1;
        }
        printf("创建socket成功!\n");
        //2.
        struct sockaddr_in addr={0};
        addr.sin_family = AF_INET;//和socket创建时第一个参数相同
        addr.sin_port = htons(80);//所有浏览器用的都是这个端口 ,htons()将小端转为大端
        addr.sin_addr.s_addr=INADDR_ANY;//当前电脑上任意网卡都可以,
        //inet_addr("127.0.0.1");       //或者可以这样写,绑定本地回环ip
        //int_addr("192.168.232.128");  //或者本机ip
        //3.
        int r = bind(fd,(struct sockaddr*)&addr,sizeof addr);
        if(r==-1){
                perror("绑定失败:");
                close(fd);
                return -1;
        }
        printf("绑定成功!\n");
        //4.
        r = listen(fd,10);
        if(r==-1){
                perror("监听失败:");
                close(fd);
                return -1;
        }
        printf("监听成功!\n");

        return fd;
}

//处理客户端请求
void handclient(int fd)
{
        //接收客户端的请求      
        char buff[1024*1024]={0};//1M
        int r=read(fd,buff,sizeof buff);
        if(r>0){
                printf("接收到客户端请求:%s\n",buff);

        //解析客户端请求
        char fileName[20]={0};
        sscanf(buff,"GET /%s",fileName);
        printf("解析出的文件名为:%s",fileName);

        //根据文件名 得到文件类型,告诉服务器 发送什么文件      
        char* mime = NULL;
        if(strstr(fileName,".html")){
                mime="text/html";//文本类型或html类型   
        }else if(strstr(fileName,".jpg")){
                mime="image/jpg";//图片类型
        }

        //构建响应
        char response[1024*1024]={0};
        //首行与header
        sprintf(response,"HTTP/1.1 200 0k\r\nContent-type:%s\r\n\r\n",mime);

        //写入文件内容
        int responseLen=strlen(response);
        int responseLen=strlen(response);
        int fileFd = open(fileName,O_RDONLY);//只读打开文件
        int fileLen = read(fileFd,response+responseLen,sizeof(response)-responseLen);
        write(fd,response,responseLen+fileLen);
        close(fileFd);
        sleep(2);


        }
}
                                    
版权声明:本文为qq_42069216原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42069216/article/details/109219831

智能推荐

python网络编程之多线程并发tcp/socket服务器

python多线程实现tcp socket 服务器代码 客户端代码  ...

用网络编程中socket编写服务器与客户端程序(TCP)

  服务器程序: 1. 创建一个socket,用函数socket() 2. 绑定IP地址、端口等信息到socket上,用函数bind() 3.设置允许的最大连接数,用函数listen() 4.接收客户端上来的连接,用函数accept() 5.收发数据,用函数send()和recv(),或者read()和write() 6.关闭网络连接 客户端程序: 1.创建一个socket,用函数soc...

Linux C/C++ Socket网络编程 TCP 服务器

这个是简单版,只为提供搭建TCP服务器简易模板,代码在linux可直接运行    ...

网络编程:linux下的socket套接字编程之TCP服务器

文章目录 前言 一、Internet历史 二、网络体系结构 1.OSI模型 2.TCP/IP模型 三、网络设计框架 四、TCP服务器编写流程 五、TCP客户端编写流程 总结 前言 socket编程是一门网络编程技术,在主要的网络通信中都会使用到它,可以使用socket编程来实现计算机之间的通信。 一、Internet历史 1968:ARPAnet(阿帕网) 采用的协议 NCP(网络控制协议). i...

猜你喜欢

网络socket编程: 实现多执行流并发TCP服务器

刚刚我们实现了一个TCP通信, 但是效果不太理想, 那么我们来实现一个能和多用户连续通信的TCP吧~ TCP通信流程以及代码实现 文章目录 原因分析 多进程实现并发服务器 多线程实现并发服务器 原因分析 我们的TCP之所以只能和用户进行单此通信, 是因为主进程要完成的事情太多了, 他既要获取新连接, 又要与用户进行通信 如果我们让一个执行流只负责一件事情, 就算某个执行流阻塞了, 也不会影响其他的...

网络编程之【TCP服务器】

TCP服务器 基于上一篇文章,我们利用socket编写了一个UDP服务器,链接如下:UDP服务器 今天我们来实现一个TCP服务器并且对这个TCP服务器进行优化。 TCP协议的特点 有连接的 面向字节流的 可靠的传输 - TCP服务器需要用到的接口 TCP服务器和UDP服务器相同,都是利用SOCKET API接口来实现的,那么创建socket,和绑定bind和UDP是一摸一样的,但是因为我们上面讲到...

Linux网络编程——TCP服务器

学习笔记,小白可以相互学习,大佬看到能告诉咱理解不对的地方就好了。 1.TCP服务器流程  1.socket,创建服务器(创建socket套接字) 2.bind,设置服务器的IP地址和端口号(将socket和服务器的IP地址和端口号进行绑定) 3.listen,启动监听(启动服务器) 4. accept,等待服务器的连接请求(如果没有连接请求则等待,如果有连接请求,则建立连接) whil...

第十一章:网络通信-socket:网络通信-TCP/IP客户和服务器-选择监听地址

11.2.2.5 选择监听地址 将服务器绑定到正确的地址很重要,这样客户才能与之通信。前面的例子都使用’localhost’作为IP地址,这会限制其与在同一服务器上运行 的客户的连接。可以使用服务器的一个公共地址,如gethostname()返回的值,来允许其他主机连接。下面这个例子修改了回送服务器,使它监听通过一个命令行参数指定的地址。 测试这个服务器之前,需要对客户程序...