Linux Linux程序练习十(网络编程大文件发送)

//网络编程客户端--大文件传输
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int arg,char *args[])
{
    if(arg<4)
    {
        printf("please print three param !\n");
        return -1;
    }
    int port=atoi(args[2]);
    //create socket
    int st=socket(AF_INET,SOCK_STREAM,0);
    if(st==-1)
    {
        printf("create socket failed ! error message :%s\n",strerror(errno));
        return -1;
    }
    //defien IP address
    struct sockaddr_in addr;
    //init addr
    memset(&addr,0,sizeof(addr));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(port);
    addr.sin_addr.s_addr=inet_addr(args[1]);
    if(connect(st,(struct sockaddr *)&addr,sizeof(addr))==-1)
    {
        printf("connect failed ! error message :%s\n",strerror(errno));
        goto END;
    }
    //send file

    //define file stream
    FILE * pfr=NULL;
    //open the file in read mode
    pfr=fopen(args[3],"r");
    if(pfr==NULL)
    {
        printf("open the file failed !error message :%s\n",strerror(errno));
        goto END;
    }
    char buf[1024]={0};
    size_t num=0;
    while((num=fread(buf,sizeof(char),sizeof(buf),pfr))>0)
    {
        //send part of the file
        if(send(st,buf,sizeof(char)*num,0)==-1)
        {
            printf("send failed !error message :%s\n",strerror(errno));
            break;
        }
        memset(buf,0,sizeof(buf));
    }
    fclose(pfr);
    END:close(st);
    return 0;
}
//网络编程服务端--发送大文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int arg, char *args[])
{
    if (arg < 2)
    {
        printf("please print two param !\n");
        return -1;
    }
    int port = atoi(args[1]);
    int st = socket(AF_INET, SOCK_STREAM, 0);
    if (st == -1)
    {
        printf("create socket failed ! error message :%s\n", strerror(errno));
        return -1;
    }
    //defien IP address
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    //bind port
    if (bind(st, (struct sockaddr *) &addr, sizeof(addr)) == -1)
    {
        printf("bind failed ! error message :%s\n", strerror(errno));
        goto END;
    }
    //listen
    if (listen(st, 20) == -1)
    {
        printf("listen failed ! error message :%s\n", strerror(errno));
        goto END;
    }
    //只接收一个用户连接
    int clientst = 0;
    struct sockaddr_in client_addr;
    memset(&client_addr, 0, sizeof(client_addr));
    size_t client_addrlen = sizeof(client_addr);
    clientst = accept(st, (struct sockaddr *) &client_addr, &client_addrlen);
    if (clientst == -1)
    {
        printf("accept failed ! error message :%s\n", strerror(errno));
        goto END;
    }
    //recv message
    char buf[1024] = { 0 };
    int mflag = 0;
    //open the file stream
    FILE * pfa = NULL;
    pfa = fopen("/home/test/2/1.dat", "a");
    if (pfa == NULL)
    {
        printf("open the file failed ! error message :%s\n", strerror(errno));
        goto END;
    }
    while (1)
    {
        mflag = recv(clientst, buf, sizeof(buf), 0);
        if (mflag == 0)
        {
            printf("client is closed!\n");
            break;
        } else if (mflag == -1)
        {
            printf("recv message is failed ! error message :%s\n",
                    strerror(errno));
            break;
        }
        //将文件写到当前程序目录下
        fwrite(buf, sizeof(char), mflag, pfa);
        memset(buf, 0, sizeof(buf));
    }
    fclose(pfa);
    END: close(st);
    return 0;
}
.SUFFIXES:.c .o
CC=gcc
SRCS1=mclient.c
SRCS2=mserver.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=mcl
EXEC2=mser

start:$(OBJS1) $(OBJS2)
    $(CC) -o $(EXEC1) $(OBJS1)
    $(CC) -o $(EXEC2) $(OBJS2)
    @echo "-------ok-----------"
.c.o:
    $(CC) -Wall -g -o [email protected] -c $<
clean:
    rm -f $(OBJS1)
    rm -f $(EXEC1)
    rm -f $(OBJS2)
    rm -f $(EXEC2)
时间: 2024-08-24 17:02:47

Linux Linux程序练习十(网络编程大文件发送)的相关文章

Linux Linux程序练习十一(网络编程大文件发送UDP版)

//网络编程发送端--大文件传输(UDP) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arp

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

黑马程序员_Java网络编程

1,IP地址和InetAddress IP地址是互联网上每台计算机都有的自己的标记,IP地址分为5类,A类保留给政府,B类给中等规模的公司,C类给任何需要的人,D类用于组播,E类用于实验. A类  1.0.0.1-126.255.255.254  B类  128.0.0.1-191.255.255.254   C类  192.0.0.1-223.255.255.254  D类 244.0.0.1-239.255.255.254 E类 240.0.0.1-255.255.255.254 在以后开发

黑马程序员-Java 网络编程

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!-- 一.概要 学习网络编程需要向对网络模型有一定的了解,主要需要了解的网络模型有OSI参考模型和TCP/IP参考模型,现在TCP/IP模型应用最为广泛,网络编程一般都是针对TCP/IP协议参考模型的编程.但是作为学习时,OSI的学习也是必不可少的,OSI分为七层协议,分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.TCP/IP模型只有四层,分别是:网络访问层.互联网层.传输层和应用层.接下来要学习

黑马程序员_JAVASE_网络编程上

网络模型: OSI模型 TCP/IP模型 网络通信要素 ip地址 端口 通信协议 通信过程 1.找到对方IP地址 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,用唯一的数字进行标识,这些数字符号就是端口 3.定义通信规则,tcp还是udp还是其他 应用层协议 http,ftp,smtp 解析主机地址: InetAddress ia = InetAddress.getByName("www.baidu.com"); String ip = ia.getHostName();

黑马程序员__GUI_网络编程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- GUI 1.事件处理就是处理用户的一个操作这个事件,在事件发生的时候程序应做出什么反应.当事件发生在哪个组件上, 哪个组件就可以说是事件源.给事件源添加一个监听器对象,监听器对象中包含若干事件处理方法.如果事件发生了, 事件处理方法就会自

Linux IO多路复用之epoll网络编程及源码(转)

原文: 前言 本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下: 客户端从标准输入读入一行,发送到服务端 服务端从网络读取一行,然后输出到客户端 客户端收到服务端的响应,输出这一行到标准输出 服务端代码 代码如下: #include <unistd.h> #include <sys/types.h> /* basic system data types */ #include <sys/soc

Linux C 程序 GTK+图形界面编程(22)

GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Linux,还支持所有类型的Unix和Windows.Qt良好的封装机制使模块化程度非常高,可重用性强. 桌面KDE使用Qt开发 Qt使用C++作为其开发语言,而更多的Linux下的开发者用C,GTK+使用C语言开发.基于LGPL授权,所以,GTK+是开源的. 桌面GNOME基于GTK+开发