客户端(服务器下载文件)

一、客户端代码

客户端代码

cs 复制代码
//实现TCP客户端通信
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/ip.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<fcntl.h>

int main(int argc, const char *argv[])
{
	
	//1、创建套接字
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0)
	{
		printf("创建失败\n");
		return -1;
	}
	/*
	//2、绑定套接字
	//填写自己的地址信息,不是必要的
	struct sockaddr_in clientaddr;
	clientaddr.sin_family=AF_INET;
	clientaddr.sin_port=htons(10000);
	clientaddr.sin_addr.s_addr=inet_addr("192.168.124.29");
	int bind_ret=bind(sockfd,(struct sockaddr *)&clientaddr,sizeof(clientaddr));
	if(bind_ret<0)
	{
		printf("绑定失败\n");
		return -1;
	}*/
	//3、建立连接connect
	//填写对方信息
	struct sockaddr_in destaddr;
	destaddr.sin_family=AF_INET;
	destaddr.sin_port=htons(8888);
	destaddr.sin_addr.s_addr=inet_addr("192.168.124.29");
	int connect_ret=connect(sockfd,(struct sockaddr*)&destaddr,sizeof(destaddr));
	if(connect_ret<0)
	{
		printf("连接失败\n");
		return -1;
	}
	//4、发送数据send
	while(1)
	{
		char buf[100];
		scanf("%s",buf);
		send(sockfd,buf,100,0);
		int fd=open(buf,O_WRONLY|O_CREAT|O_TRUNC,0664);
		if(fd<0)
		{
			printf("open failed");
			return -1;
		}
		while(1)
		{
			bzero(buf,100);
			int ret=recv(sockfd,buf,100,0);
			printf("%s",buf);
			if(ret==0)
				break;
			write(fd,buf,ret);
		}
		
	}
	//6、关闭文件
	close(sockfd);
	
	return 0;
}

二、服务器代码

服务器使用IO多路复用

cs 复制代码
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include<fcntl.h>

#define SERVERADDR "192.168.124.29"
#define PORT 8888

int main(int argc, const char *argv[]) {
    // 创建套接字
    int listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd < 0) {
        perror("socket failed");
        return -1;
    }

    // 绑定套接字
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(PORT);
    serveraddr.sin_addr.s_addr = inet_addr(SERVERADDR);
    if (bind(listenfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {
        perror("bind failed");
        return -1;
    }

    // 监听套接字
    if (listen(listenfd, 20) < 0) {
        perror("listen failed");
        return -1;
    }
	//定义文件描述符表
    fd_set master_fds, read_fds;
    int max_fd = listenfd;
	//清空文件描述符表
    FD_ZERO(&master_fds);
	//将监听套接字加入文件描述符表
    FD_SET(listenfd, &master_fds);

    while (1)
	{
        read_fds = master_fds;

        // 监视文件描述符集,进程通知内核监视的内核是否准备就绪(是否有IO事件)
        int activity = select(max_fd + 1, &read_fds, NULL, NULL, NULL);
        if (activity < 0) 
		{
            perror("select failed");
            return -1;
        }

        // 处理新连接
        if (FD_ISSET(listenfd, &read_fds))
		{
            struct sockaddr_in clientaddr;
            socklen_t len = sizeof(clientaddr);
            int client_fd = accept(listenfd, (struct sockaddr*)&clientaddr, &len);
            if (client_fd < 0)
			{
                perror("accept failed");
                continue;
            }
            printf("New connection from %s:%hu\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
            //将新创建的客户端文件描述符加入到文件描述符表当中
			FD_SET(client_fd, &master_fds);
            if (client_fd > max_fd)
			{
                max_fd = client_fd;
            }
        }

        // 处理已连接客户端的数据
        for (int i = listenfd + 1; i <= max_fd; ++i)
		{
            if (FD_ISSET(i, &read_fds))
			{
                char buf[100];
                bzero(buf, 100);
                int ret = read(i, buf, 100);
				int fd=open(buf,O_RDONLY);
				if(fd<0)
				{
					printf("open failed\n");
					return -1;
				}
				char file[100];
				while(1)
				{
					bzero(file,100);
				   int read_ret = read(fd,file,100);
				   printf("%d ",read_ret);
				   if(read_ret==0)
					   break;
                  send(i, file, read_ret,0);
				}
				printf("download ok\n");
            }
        }
    }

    close(listenfd);
    return 0;
}
相关推荐
wuk99811 分钟前
CentOS7环境搭建L2TP服务器
运维·服务器
恒创科技HK13 分钟前
香港1核2G云服务器当网站服务器够用不?
运维·服务器
IT 小阿姨(数据库)33 分钟前
PostgreSQL 之上的开源时序数据库 TimescaleDB 详解
运维·数据库·sql·postgresql·开源·centos·时序数据库
颜大哦1 小时前
linux安装mysql
linux·运维·mysql·adb
学习3人组1 小时前
Node.js 网站服务器开发
运维·服务器·node.js
来知晓1 小时前
Linux:WSL内存空间管理之清完内存C盘可用空间不增问题解决
linux·运维·服务器
GTgiantech2 小时前
科普SFP 封装光模块教程
服务器·网络·数据库
深圳市恒讯科技2 小时前
如何在服务器上安装和配置数据库(如MySQL)?
服务器·数据库·mysql
wanhengidc3 小时前
云手机能够流畅运行大型游戏吗
运维·服务器·游戏·智能手机·云计算
繁华的地方不一定留下你的脚印3 小时前
ubuntu18.04版本配置静态IP并且可以上网(解决配置静态IP不能额上网的问题)
运维·服务器