socket-文件传输-C-发送端

25 篇文章 2 订阅

socket文件传输-发送端

接收端:https://blog.csdn.net/qq_33904382/article/details/104827718

C,使用socket传输文件的服务端;主函数也可作为一般服务程序的基本框架。


主程序:

/*
        author:hhy
        time: 2020/3/7

 */

/* Basic IO */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* structure */
#include<arpa/inet.h>
#include<netinet/in.h>
/* socket */
#include<sys/socket.h>
/* signal */
#include<signal.h>
#include<errno.h>
typedef struct sockaddr SA;
const int maxsize=1024;

void child_do(int connectsock); /* real reaction of son-process for clients' requests */
void sig_chld(int signo);/* sig dealing function ,for SIGCHLD */

int main()
{
        //Create Socket
                int ListeningSocket = socket(AF_INET,SOCK_STREAM,0);
        //Init Address Structure
                struct sockaddr_in ListenAddrStrc,ConnectedAddrStrc;
                memset(&ListenAddrStrc,0,sizeof(ListenAddrStrc));
                ListenAddrStrc.sin_family = AF_INET;
                ListenAddrStrc.sin_addr.s_addr = htonl(INADDR_ANY);
                ListenAddrStrc.sin_port = htons(13000);
        //Bind Socket and Address
                bind(ListeningSocket,(SA*)&ListenAddrStrc,sizeof(ListenAddrStrc));
        //Listen to the Listening Socket
                listen(ListeningSocket,5);

                signal(SIGCHLD,sig_chld);/* for fork(),catching SIGCHLD signal */
        //Listening and Accpet、Reply
                for(;;){
                //Accpet client's asking
                        socklen_t clilen = sizeof(ConnectedAddrStrc);
                        int ConnectedSocket = accept(ListeningSocket,(SA*)&ConnectedAddrStrc,&clilen);

                //deal with interruption of slow systen call accept()>
                        if(ConnectedSocket<0){
                                if(errno == EINTR)/* be interrupted by sig dealing func */
                                        continue;/* retry,restart accept() again */
                                else{   /* other errno . */
                                        fprintf(stderr,"errno:wrong of accept()");
                                        exit(0);
                                }
                        }
                //What children does
                        int child_pid;
                        if((child_pid=fork())==0){
                                close(ListeningSocket);/* close listeningsocket in child process */
                                child_do(ConnectedSocket);
                                exit(0);
                        }
                        close(ConnectedSocket);
                }
return 0;

}

child_do: 子进程执行实际任务(答复以指定文件给发起请求的client端)

void child_do(int connectsocket)
{
        /* trans file to  */
        int n;
        char buffer[maxsize];
        memset(buffer,0,maxsize);/* Init the buffer */
        int srcfile = open("./TransSender.c",O_RDONLY);
        while((n = read(srcfile,buffer,maxsize))>0){
                write(connectsocket,buffer,n);
        }
}


sig_chld: 子进程SIGCHLD信号处理函数

void sig_chld(int signo)
{
        pid_t pid;/* identify number of son-process */
        int stat;/* return end status of the son-process */
        while((pid=(waitpid(-1,&stat,WNOHANG))));/* arg WNOHANG means don't hang when sth is running */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值