linuxsocket传输文件|linux下C语言用socket网络编程怎么计算传输速度

linuxsocket传输文件|linux下C语言用socket网络编程怎么计算传输速度的第1张示图

㈠ 如何在linux下使用c语言 利用select和pthread编写可以实现多用户的大文件传输的socket通信程序

你的意思是单独使用来select或者单自独使用pthread么?单独使用select的话,就是server的监听socket监听到来自client的请求,那么就会有一个socket句柄,通过使用select来管理多个句柄,而不需要多个线程thread。单独使用thread的话,就是server监听到socket请求,那么就会创建一个thread来处理文件的传输的事儿。那么这样的话就会有穿多个文件,就会有多个线程出现。

㈡ Linux下socket并发连接数怎么设置

并发socket连接数的多少决定于系统资源的多少,没有一个常值的.在实际开发或者linux系统管理中也会根据需要进行相应的设置.1.一般来说每一个网络连接,都会建立相应的socket句柄,同时每个连接也会有标准输入输出等基本的文件文件句柄,而且每一个socket连接都是进行文件操作的,因此连接数决定于系统资源.2.Linux上一般可以通过ulimit来进行相应的资源限制,默认能打开的文件描述符自己可以查看.如下图所示:3.ulimit的命令格式:ulimit [-acdfHlmnpsStvw] [size]参数说明:-H 设置硬资源限制.-S 设置软资源限制.-a 显示当前所有的资源限制.-c size:设置core文件的最大值.单位:blocks-d size:设置数据段的最大值.单位:kbytes-f size:设置创建文件的最大值.单位:blocks-l size:设置在内存中锁定进程的最大值.单位:kbytes-m size:设置可以使用的常驻内存的最大值.单位:kbytes-n size:设置内核可以同时打开的文件描述符的最大值.单位:n-p size:设置管道缓冲区的最大值.单位:kbytes-s size:设置堆栈的最大值.单位:kbytes-t size:设置CPU使用时间的最大上限.单位:seconds-v size:设置虚拟内存的最大值.单位:kbytes-u <程序数目> 用户最多可开启的程序数目

㈢ linux下C语言用socket网络编程怎么计算传输速度

这要你的通信程序协商一个协议,比如定义一个通信结构体,传文件的时候,一开始内发送结构体的信容息过去,告诉对端你的文件总大小,然后,传输过程中,统计已经收到或者发送的数据,做个除法就得到速率了。具体这类协商,你可以自己随便想,也可以借鉴现有的比较好的一些设计,有些考虑断点续传的技术,还有压缩的,看你代码也不需要考虑吧。

㈣ linux socket 设置从哪个网络设备发送数据 SO

原因:1、因为服务器是时时在监听有没有客户端的连接,如果服务器不绑定IP和端口的话,客户端上线的时候怎么连到服务器呢,所以服务器要绑定IP和端口,而客户端就不需要了,客户端上线是主动向服务器发出请求的,因为服务器已经绑定了IP和端口,所以客户端上线的就向这个IP和端口发出请求,这时因为客户开始发数据了(发上线请求),系统就给客户端分配一个随机端口,这个端口和客户端的IP会随着上线请求一起发给服务器,服务收到上线请求后就可以从中获起发此请求的客户的IP和端口,接下来服务器就可以利用获起的IP和端口给客户端回应消息了。2、采用UDP通信1)若有客户端和服务器之分的程序,创建sock后即可在该socket上用recvfrom/sendto方法发送接受数据了,因为客户端只需要用sendto发送数据到指定的地址,当然若是bind了,程序也没什么问题,区别就是系统用默认自动bind()指定你自己的socket参数地址(特别是在指定特定端口的UDP对等通信)只是这种情况没有这样用的。那UDP服务器是怎么知道客户端的IP地址和UDP端口?一般来说有两种方式:一种是客户端发消息显式地告诉服务器IP地址和端口,消息内容就包括IP地址和UDP端口。另外一种就是隐式的,服务器从收到的包的头部中得到包的源IP地址和端口。2)若是没有客户端和服务器之分的程序,即自己指定特定端口的UDP对等通信,则客户端和服务器都需要bind()IP地址和端口了。通常udp服务端根本不需要知道客户端的socket,它直接建立一个socket用于发送即可,udp通信的关键只在于IP和端口。多个客户端如果需要点到点分发,必须给服务端socket循环设置每个客户端的IP并发出,但更常用的是广播分发,服务端socket设定一个X.X.X.255的广播地址并始终向它发送,每个客户端建立的socket只需要绑定这个广播地址便可以收到。客户端用不用bind 的区别无连接的socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。使用bind函数时,通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。 Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。 有连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息,无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候打开端口。(当然也有特殊情况,linux系统中rlogin命令应当调用bind函数绑定一个未用的保留端口号,还有当客户端需要用指定的网络设备接口和端口号进行通信等等)总之:1.需要在建连前就知道端口的话,需要 bind 2.需要通过指定的端口来通讯的话,需要 bind具体到上面那两个程序,本来用的是TCP,客户端就不用绑定端口了,绑定之后只能运行一个client 的程序,是属于自己程序中人为设定的障碍,而从服务器那边得到的客户机连接端口号(是系统自动分配的)与这边客户机绑定的端口号根本是不相关的,所以客户 绑定也就失去了意义。注意:一个端口可以用于多个连接(比如多个客户端连接服务器的同一端口)。但是在同一个操作系统上,即服务器和客户端都是本机上,多个客户端去连接服务器,只有第一个客户端的连接会被接收,第二个客户端的连接请求不会被接收。首先,服务器和客户端都可以bind,bind并不是服务器的专利。客户端进程bind端口: 由进程选择一个端口去连服务器,(如果默认情况下,调用bind函数时,内核指定的端口是同一个,那么运行多个调用了bind 的client 程序,会出现端口被占用的错误)注意这里的端口是客户端的端口。如果不分配就表示交给内核去选择一个可用端口。客户端进程bind IP地址:相当于为发送出去的IP数据报分配了源IP地址,但交给进程分配IP地址的时候(就是这样写明了bind IP地址的时候)这个IP地址必须是主机的一个接口,不能分配一个不存在的IP。如果不分配就表示由内核根据所用的输出接口来选择源IP地址。 一般情况下客户端是不用调用bind函数的,一切都交给内核搞定! 服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。 服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接,一般一个服务器程序里都有servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是针对IP4,IP6代码不太一样这样一句话,意思就是:我不指定客户端的IP,随便连,来者不拒!总之只要你bind时候没有指定哪一项(置为0),内核会帮你选择。

㈤ linux下socket文件传输问题

如果你的客户端在发送文件时,每次都重新connect,再进行数据传输,则你的程序无回法解决数据的区分。答如果客户端是一次connect循环发送,后台服务循环接收,则(1)如果你的服务端只有一个进程(不支持并发),则A和B不会同时运行,只能按顺序接收完A再接收B(2)如果,每一个新链接上来,你都建立一个新的进程去工作,则不会有问题。

㈥ 求 Linux下socket编程,用于传递文件,并且用CRC校验的源代码!

把CRC写入文件,然后再传输文件。接收的部分,先收完文件,再从文件中读出CRC进行判断。不成功则报错,丢弃文件。

㈦ linux socket 文件句柄是全局的吗

不是。在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(filehandle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。

㈧ linux 下用socket 文件传输问题(UDP)

要下班了,时间急,不写代码了先给你一个思路 1 实现最简单的udp socket 模型,实现发送一个字符串。 2 实现一个简单的打开文件,读取文件的例子,如用fgets(),类似的函数有很多,然后再把读取的文件内容忘另一个文件里写(相关函数fopen(),write(),read())。 3 把上面两个函数结合到一起,在客户端实现打开要传送的文件,按一定的大小读取,读取后调用sendto()发送到服务器端。在服务器端创建一个文件,然后调用recvfrom()接受客户端发送过来的数据,向来是创建的那个文件中写。 下面是改好的udp发送文件的例子。服务器端程序的编译gcc -o file_server  file_server客户端程序的编译gcc -o file_client  file_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client  运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程序的运行,在另一个终端中执行./file_client  127.0.0.1说明: 任何计算机都可以通过127.0.0.1访问自己. 也可以用计算机的实际IP地址代替127.0.0.1//////////////////////////////////////////////////////////////////////////////////////// file_server.c  文件传输顺序服务器示例////////////////////////////////////////////////////////////////////////////////////////本文件是服务器的代码#include <netinet/in.h>    // for sockaddr_in#include <sys/types.h>    // for socket#include <sys/socket.h>    // for socket#include <stdio.h>        // for printf#include <stdlib.h>        // for exit#include <string.h>        // for bzero/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>*/#define HELLO_WORLD_SERVER_PORT    6666#define LENGTH_OF_LISTEN_QUEUE  20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){    //设置一个socket地址结构server_addr,代表服务器internet地址, 端口    struct sockaddr_in server_addr, pcliaddr;    bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0    server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htons(INADDR_ANY);    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);    //创建用于internet的据报套接字(UDPt,用server_socket代表服务器socket // 创建数据报套接字(UDP)    int server_socket = socket(PF_INET,SOCK_DGRAM,0);    if( server_socket < 0)    {        printf("Create Socket Failed!");        exit(1);    }       //把socket和socket地址结构联系起来    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))    {        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);        exit(1);    }       while (1) //服务器端要一直运行    {        //定义客户端的socket地址结构client_addr        struct sockaddr_in client_addr;        socklen_t n = sizeof(client_addr) ; int length;        char buffer[BUFFER_SIZE];        bzero(buffer, BUFFER_SIZE);        length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,&pcliaddr,&n);        if (length < 0)        {            printf("Server Recieve Data Failed!\n");            break;        }        char file_name[FILE_NAME_MAX_SIZE+1];        bzero(file_name, FILE_NAME_MAX_SIZE+1);        strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));//        int fp = open(file_name, O_RDONLY);//        if( fp < 0 )        FILE * fp = fopen(file_name,"r");        if(NULL == fp )        {            printf("File:\t%s Not Found\n", file_name);        }        else        {            bzero(buffer, BUFFER_SIZE);            int file_block_length = 0;//            while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)            while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0)            {                printf("file_block_length = %d\n",file_block_length);                //发送buffer中的字符串到new_server_socket,实际是给客户端                if(send(new_server_socket,buffer,file_block_length,0)<0)                {                    printf("Send File:\t%s Failed\n", file_name);                    break;                }                bzero(buffer, BUFFER_SIZE);            }//            close(fp);            fclose(fp);            printf("File:\t%s Transfer Finished\n",file_name);        }    }}//////////////////////////////////////////////////////////////////////////////////////// file_client.c  文件传输客户端程序示例////////////////////////////////////////////////////////////////////////////////////////本文件是客户机的代码#include <netinet/in.h>    // for sockaddr_in#include <sys/types.h>    // for socket#include <sys/socket.h>    // for socket#include <stdio.h>        // for printf#include <stdlib.h>        // for exit#include <string.h>        // for bzero/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>*/#define HELLO_WORLD_SERVER_PORT    6666#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){    if (argc != 2)    {        printf("Usage: ./%s ServerIPAddress\n",argv[0]);        exit(1);    }    //设置一个socket地址结构client_addr,代表客户机internet地址, 端口    struct sockaddr_in client_addr;    bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0    client_addr.sin_family = AF_INET;    //internet协议族    client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址    client_addr.sin_port = htons(0);    //0表示让系统自动分配一个空闲端口    //创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket    int client_socket = socket(AF_INET,SOCK_DGRAM,0);    if( client_socket < 0)    {        printf("Create Socket Failed!\n");        exit(1);    }    //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口    struct sockaddr_in server_addr;    bzero(&server_addr,sizeof(server_addr));    server_addr.sin_family = AF_INET;    if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数    {        printf("Server IP Address Error!\n");        exit(1);    }    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);    socklen_t server_addr_length = sizeof(server_addr);    char file_name[FILE_NAME_MAX_SIZE+1];    bzero(file_name, FILE_NAME_MAX_SIZE+1);    printf("Please Input File Name On Server:\t");    scanf("%s", file_name);       char buffer[BUFFER_SIZE];    bzero(buffer,BUFFER_SIZE);    strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));    //向服务器发送buffer中的数据     socklen_t n = sizeof(server_addr) ;    sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)&server_addr,n);//    int fp = open(file_name, O_WRONLY|O_CREAT);//    if( fp < 0 )    FILE * fp = fopen(file_name,"w");    if(NULL == fp )    {        printf("File:\t%s Can Not Open To Write\n", file_name);        exit(1);    }       //从服务器接收数据到buffer中    bzero(buffer,BUFFER_SIZE);    int length = 0;    while( length = recv(client_socket,buffer,BUFFER_SIZE,0))    {        if(length < 0)        {            printf("Recieve Data From Server %s Failed!\n", argv[1]);            break;        }//        int write_length = write(fp, buffer,length);        int write_length = fwrite(buffer,sizeof(char),length,fp);        if (write_length<length)        {            printf("File:\t%s Write Failed\n", file_name);            break;        }        bzero(buffer,BUFFER_SIZE);       }    printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);    return 0;}

㈨ linux下socket编程,怎样把文件和文件属性一起发送到服务器端

socket可以发送任意类型的数据。socket本身不限制你要发送什么,而是由你自己来定要发什么的。只要你接收端能识别发来的是什么即可。协议的三个基本要素,语法、语义、同步。比如你用于表示文件属性的结构体或者其他什么数据长度固定是20字节,那么你就在发送文件内容之前把这20字节发送过去,接收端在接收内容之前,固定会先接收20字节并作为文件属性,随后接收到的内容才作为数据存入文件,这样就可以做到了。关键点就在于自己要定好语法、语义、同步这些,发送端和接收端配合好动作。

㈩ linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。。谢谢

server:#include <stdio.h> #include <errno.h>#include <unistd.h>#include <signal.h>#include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>#include <netinet/in.h> #include <syslog.h>#include <sys/time.h> #include <string.h> #include <fcntl.h>#include <sys/wait.h>#define MAXDATASIZE 1024 #define SERVPORT 19999 #define BACKLOG 10 int SendFileToServ(const char *path, const char *FileName, const char *ip){#define PORT 20002 int sockfd; int recvbytes; char buf[MAXDATASIZE]; char send_str[MAXDATASIZE]; char filepath[128] = {0}; struct sockaddr_in serv_addr; FILE *fp; sprintf(filepath, "%s%s", path, FileName); if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return 1; } bzero(&serv_addr,sizeof(struct sockaddr_in)); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(PORT); inet_aton(ip, &serv_addr.sin_addr); int IErrCount = 0;again: if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1) { if (5 == IErrCount) return 1; IErrCount++; perror("connect"); sleep(2); goto again; } //if ((fp = fopen(FileName, "rb")) == NULL) if ((fp = fopen(filepath, "rb")) == NULL) { perror("fopen "); return 1; } recvbytes = write(sockfd, FileName, strlen(FileName)); recvbytes = read(sockfd, buf, MAXDATASIZE); if (!memcmp(buf, "sendmsg", 7)) { while(fgets(send_str, MAXDATASIZE, fp)) { recvbytes = write(sockfd, send_str, strlen(send_str)); recvbytes = read(sockfd, buf, MAXDATASIZE); if (recvbytes <= 0) { fclose(fp); close(sockfd); return 1; } if (memcmp(buf, "goon", 4)) { fclose(fp); close(sockfd); return 1; } } recvbytes = write(sockfd, "end", 3); } else { fclose(fp); close(sockfd); return 1; } memset(buf, 0, MAXDATASIZE); if (read(sockfd, buf, MAXDATASIZE) <= 0) { close(sockfd); return 2; } char *Eptr = "nginx reload error"; //printf("bf[%s]\n", buf); int ret; ret = strncmp(buf, Eptr, strlen(Eptr)); //printf("%d\n", ret); if (!ret) { close(sockfd); return 2; } close(sockfd); return 0;}int mysyslog(const char * msg){ FILE *fp; if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL) { return 0; } fprintf(fp, "[%s]\n", msg); fclose(fp); return 0;}static void quit_handler(int signal){ kill(0, SIGUSR2); syslog( LOG_NOTICE, "apuserv quit…"); // do something exit thing ,such as close socket ,close mysql,free list // ….. //i end exit(0);}static int re_conf = 0;static void reconf_handler(int signal){ re_conf=1; syslog(LOG_NOTICE,"apuserv reload configure file ."); // 请在循环体中判断,如果re_conf == 1,请再次加载配置文件。}static int isrunning(void){ int fd; int ret; struct flock lock; lock.l_type = F_WRLCK; lock.l_whence = 0; lock.l_start = 0; lock.l_len = 0; const char *lckfile = "/tmp/apuserv.lock"; fd = open(lckfile,O_WRONLY|O_CREAT); if (fd < 0) { syslog(LOG_ERR,"can not create lock file: %s\n",lckfile); return 1; } if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) { ret = fcntl(fd,F_GETLK,&lock); if (lock.l_type != F_UNLCK) { close(fd); return lock.l_pid; } else { fcntl(fd,F_SETLK,&lock); } } return 0;}int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth){ sscanf(buf, "%s %s %s", pth, FileName, str); printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str); return 0;}int main(int argc, char **argv) { int sockfd,client_fd; socklen_t sin_size; struct sockaddr_in my_addr,remote_addr; char buff[MAXDATASIZE]; int recvbytes; #if 1 int pid ; char ch ; int ret; int debug = 0; signal(SIGUSR1, SIG_IGN); signal(SIGUSR2, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGTERM, quit_handler); syslog(LOG_NOTICE,"apuserver start…."); while ((ch = getopt(argc, argv, "dhV")) != -1) { switch (ch) { case 'd': debug = 1; break; case 'V': printf("Version:%s\n","1.0.0"); return 0; case 'h': printf(" -d use daemon mode\n"); printf(" -V show version\n"); return 0; default: printf(" -d use daemon mode\n"); printf(" -V show version\n"); } } if (debug && daemon(0,0 ) ) { return -1; } if (isrunning()) { fprintf(stderr, "apuserv is already running\n"); syslog(LOG_INFO,"apuserv is already running\n"); exit(0); } while (1) { pid = fork(); if (pid < 0) return -1; if (pid == 0) break; while ((ret = waitpid(pid, NULL, 0)) != pid) { syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret); if (ret < 0) syslog(LOG_NOTICE, "waitpid errno:%d", errno); } kill(0, SIGUSR2); sleep(1); syslog(LOG_NOTICE,"restart apuserver"); } signal(SIGHUP, reconf_handler); signal(SIGPIPE, SIG_IGN); signal(SIGUSR1,SIG_IGN); signal(SIGUSR2, SIG_DFL); signal(SIGTERM, SIG_DFL);#endif if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(1); } bzero(&my_addr,sizeof(struct sockaddr_in)); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1) { perror("bind"); exit(1); } if(listen(sockfd,BACKLOG)==-1) { perror("listen"); exit(1); } int nret; while(1) { sin_size = sizeof(struct sockaddr_in); if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1) { perror("falied accept"); continue; } memset(buff, 0, MAXDATASIZE); recvbytes = read(client_fd, buff, MAXDATASIZE); char str[16] = {0}; char FileName[128] = {0}; char path[128] = {0}; MyHandleBuff(buff, str, FileName, path); if (recvbytes > 0) { nret = SendFileToServ(path, FileName, str); printf("nret[%d]\n", nret); if (1 == nret) write(client_fd, "send file error", 15); else if(2 == nret) write(client_fd, "reload nginx error", 18); else write(client_fd, "succ", 4); } close(client_fd); } }_________________________________________________client:#include <stdio.h> #include <errno.h>#include <unistd.h>#include <signal.h>#include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>#include <netinet/in.h> #include <syslog.h>#include <sys/time.h> #include <string.h> #include <fcntl.h>#include <sys/wait.h>#define MAXDATASIZE 1024 #define SERVPORT 20002#define BACKLOG 10 int mysyslog(const char * msg){ FILE *fp; if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL) { return 0; } fprintf(fp, "[%s]\n", msg); fclose(fp); return 0;}static void quit_handler(int signal){ kill(0, SIGUSR2); syslog( LOG_NOTICE, "apuserv quit…"); // do something exit thing ,such as close socket ,close mysql,free list // ….. //i end exit(0);}static int re_conf = 0;static void reconf_handler(int signal){ re_conf=1; syslog(LOG_NOTICE,"apuserv reload configure file ."); // ????·???????1nf == 1£???′μ????? static int isrunning(void){ int fd; int ret; struct flock lock; lock.l_type = F_WRLCK; lock.l_whence = 0; lock.l_start = 0; lock.l_len = 0; const char *lckfile = "/tmp/dstserver.lock"; fd = open(lckfile,O_WRONLY|O_CREAT); if (fd < 0) { syslog(LOG_ERR,"can not create lock file: %s\n",lckfile); return 1; } if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) { ret = fcntl(fd,F_GETLK,&lock); if (lock.l_type != F_UNLCK) { close(fd); return lock.l_pid; } else { fcntl(fd,F_SETLK,&lock); } } return 0;}int main(int argc, char **argv) { int sockfd,client_fd; socklen_t sin_size; struct sockaddr_in my_addr,remote_addr; char buff[MAXDATASIZE]; int recvbytes; #if 1 int pid ; char ch ; int ret; int debug = 0; signal(SIGUSR1, SIG_IGN); signal(SIGUSR2, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGTERM, quit_handler); syslog(LOG_NOTICE,"dstserver start…."); while ((ch = getopt(argc, argv, "dhV")) != -1) { switch (ch) { case 'd': debug = 1; break; case 'V': printf("Version:%s\n","1.0.0"); return 0; case 'h': printf(" -d use daemon mode\n"); printf(" -V show version\n"); return 0; default: printf(" -d use daemon mode\n"); printf(" -V show version\n"); } } if (debug && daemon(0,0 ) ) { return -1; } if (isrunning()) { fprintf(stderr, "dstserver is already running\n"); syslog(LOG_INFO,"dstserver is already running\n"); exit(0); } while (1) { pid = fork(); if (pid < 0) return -1; if (pid == 0) break; while ((ret = waitpid(pid, NULL, 0)) != pid) { syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret); if (ret < 0) syslog(LOG_NOTICE, "waitpid errno:%d", errno); } kill(0, SIGUSR2); sleep(1); syslog(LOG_NOTICE,"restart apuserver"); } signal(SIGHUP, reconf_handler); signal(SIGPIPE, SIG_IGN); signal(SIGUSR1,SIG_IGN); signal(SIGUSR2, SIG_DFL); signal(SIGTERM, SIG_DFL);#endif if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(1); } bzero(&my_addr,sizeof(struct sockaddr_in)); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1) { perror("bind"); exit(1); } if(listen(sockfd,BACKLOG)==-1) { perror("listen"); exit(1); } char filepath[MAXDATASIZE]= {0}; FILE *fp; while(1) { sin_size = sizeof(struct sockaddr_in); if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1) { perror("falied accept"); continue; } memset(buff, 0, MAXDATASIZE); recvbytes = read(client_fd, buff, MAXDATASIZE); sprintf(filepath, "/etc/nginx/url_rule/%s", buff); if ((fp = fopen(filepath, "wb")) == NULL) { perror("fopen"); close(client_fd); continue; } write(client_fd, "sendmsg", 7); while(read(client_fd, buff, MAXDATASIZE)) { if (!memcmp(buff, "end", 3)) { fclose(fp); break; } else { fprintf(fp, "%s", buff); write(client_fd, "goon", 4); } } //system("nginx -s reload"); char *Sptr = "nginx reload succ"; char *Eptr = "nginx reload error"; int ret; ret = system("nginx -s reload"); printf("ret[%d]\n", ret); if (ret != 0) { write(client_fd, Eptr, strlen(Eptr)); } else { write(client_fd, Sptr, strlen(Sptr)); } close(client_fd); } }以前写的:内容忘记了。不是很复杂你可以自己看!

未经允许不得转载:山九号 » linuxsocket传输文件|linux下C语言用socket网络编程怎么计算传输速度

赞 (0)