高埗镇仿做网站,网站空间类型,巴南网站制作,做网站参考文献之前写了篇博客#xff1a;AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比 然后利用的是发送端读取大文件#xff0c;接收方接收并保存为文件的方式进行测试#xff0c;结果发现#xff0c;AF_UNIX并未比127.0.0.1(AF_INET)回环地址优秀#xff0c;若单次发送的字节数…之前写了篇博客AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比 然后利用的是发送端读取大文件接收方接收并保存为文件的方式进行测试结果发现AF_UNIX并未比127.0.0.1(AF_INET)回环地址优秀若单次发送的字节数少时回环地址反而更快。
由于测试时发送的是1.15G大小的文件比较快就发送结束了而且读文件写文件是个比较费时的操作本人考虑到读写文件费时的影响决定发送端自己构造字符串接收方只统计接收到的字符个数并不写文件。然后发送端发送100秒对比下100秒之内AF_UNIX和回还地址接收到的字节个数。
AF_UNIX服务端代码(unixsocketserver2.c)
#include stdlib.h
#include stdio.h
#include stddef.h
#include sys/socket.h
#include sys/un.h
#include errno.h
#include string.h
#include unistd.h
#include ctype.h #define MAXLINE 80 char *socket_path /tmp/server.socket; #define RECV_LEN 1000000int main(void)
{ fd_set readmask, exceptmask;struct timeval tv;int maxfd FD_SETSIZE;int nready 0;char buf[RECV_LEN 1];int readbyte, writebyte;struct sockaddr_un serun, cliun; socklen_t cliun_len; int listenfd, connfd, size; if ((listenfd socket(AF_UNIX, SOCK_STREAM, 0)) 0) { perror(socket error); exit(1); } long long allrecvbyte 0;memset(serun, 0, sizeof(serun)); serun.sun_family AF_UNIX; strcpy(serun.sun_path, socket_path); size offsetof(struct sockaddr_un, sun_path) strlen(serun.sun_path); unlink(socket_path); if (bind(listenfd, (struct sockaddr *)serun, size) 0) { perror(bind error); exit(1); } printf(UNIX domain socket bound\n); if (listen(listenfd, 20) 0) { perror(listen error); exit(1); } printf(Accepting connections ...\n); cliun_len sizeof(cliun); if ((connfd accept(listenfd, (struct sockaddr *)cliun, cliun_len)) 0){ perror(accept error); goto end; }time_t now, endtime;now time(NULL);while(1){FD_ZERO(readmask);FD_ZERO(exceptmask);FD_SET(connfd, readmask);FD_SET(connfd, exceptmask);tv.tv_sec 3;tv.tv_usec 0;nready select(maxfd, readmask, NULL, exceptmask, tv);if(nready 0){goto end;}if(nready 0){printf(nready 0\n);continue;}if(FD_ISSET(connfd, readmask)){readbyte recv(connfd, buf, RECV_LEN, 0);if(readbyte 0){perror(readbyte 0);goto end;}if(readbyte 0){perror(readbyte 0);goto end;}if(readbyte 0){allrecvbyte readbyte;}}if(FD_ISSET(connfd, exceptmask)){printf(select, exceptmask\n);goto end;}}
end:endtime time(NULL);printf(costs %d seconds, allrecvbyte is %lld\n, endtime - now, allrecvbyte);close(connfd);close(listenfd); return 0;
}
AF_UNIX客户端代码(unixsocketclient2.c)
#include stdlib.h
#include stdio.h
#include stddef.h
#include sys/socket.h
#include sys/un.h
#include errno.h
#include string.h
#include unistd.h #define SEND_LEN 1000000char *client_path /tmp/client.socket;
char *server_path /tmp/server.socket; int main() { struct sockaddr_un cliun, serun; int len; int sockfd, n; int i 0;if ((sockfd socket(AF_UNIX, SOCK_STREAM, 0)) 0){ perror(client socket error); exit(1); } // 一般显式调用bind函数以便服务器区分不同客户端 memset(cliun, 0, sizeof(cliun)); cliun.sun_family AF_UNIX; strcpy(cliun.sun_path, client_path); len offsetof(struct sockaddr_un, sun_path) strlen(cliun.sun_path); unlink(cliun.sun_path); if (bind(sockfd, (struct sockaddr *)cliun, len) 0) { perror(bind error); exit(1); } memset(serun, 0, sizeof(serun)); serun.sun_family AF_UNIX; strcpy(serun.sun_path, server_path); len offsetof(struct sockaddr_un, sun_path) strlen(serun.sun_path); if (connect(sockfd, (struct sockaddr *)serun, len) 0){ perror(connect error); exit(1); } int sendbyte 0;int alreadysendbyte 0;long long allsendbyte 0;char buf[SEND_LEN 1];time_t begin time(NULL);time_t now time(NULL);int continueSeconds 0;while(continueSeconds 100){alreadysendbyte 0;for(i 0; i SEND_LEN; i){buf[i] i 1;}n SEND_LEN;sendbyte send(sockfd, buf, n, 0);if(sendbyte -1){perror(send error);goto end;}alreadysendbyte sendbyte;while(alreadysendbyte n){sendbyte send(sockfd, buf alreadysendbyte, n - alreadysendbyte, 0);if(sendbyte -1){perror(send error);goto end;}alreadysendbyte sendbyte;}allsendbyte n;now time(NULL);continueSeconds now - begin;}
end:printf(allsendbyte is %lld\n, allsendbyte);close(sockfd);return 0;
}
回环地址服务端代码(loopaddrserver2.c)
#include sys/socket.h
#include arpa/inet.h
#include string.h
#include stdio.h
#include stdlib.h#define RECV_LEN 1000000int main(){fd_set readmask, exceptmask;struct timeval tv;int maxfd FD_SETSIZE;int nready 0;char buf[RECV_LEN 1];int readbyte, writebyte;int serv_socksocket(AF_INET,SOCK_STREAM,0);long long allrecvbyte 0;struct sockaddr_in serv_addr;memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrhtonl(INADDR_ANY);serv_addr.sin_porthtons(9990);bind(serv_sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));listen(serv_sock,5);struct sockaddr_in clnt_addr;socklen_t clnt_addr_sizesizeof(clnt_addr);int clnt_sockaccept(serv_sock,(struct sockaddr*)clnt_addr,clnt_addr_size);time_t now, endtime;now time(NULL);while(1){FD_ZERO(readmask);FD_ZERO(exceptmask);FD_SET(clnt_sock, readmask);FD_SET(clnt_sock, exceptmask);tv.tv_sec 3;tv.tv_usec 0;nready select(maxfd, readmask, NULL, exceptmask, tv);if(nready 0){goto end;}if(nready 0){printf(nready 0\n);continue;}if(FD_ISSET(clnt_sock, readmask)){readbyte recv(clnt_sock, buf, RECV_LEN, 0);if(readbyte 0){perror(readbyte 0);goto end;}if(readbyte 0){perror(readbyte 0);goto end;}if(readbyte 0){allrecvbyte readbyte;}}if(FD_ISSET(clnt_sock, exceptmask)){printf(select, exceptmask\n);goto end;}}
end: endtime time(NULL);printf(costs %d seconds, allrecvbyte is %lld\n, endtime - now, allrecvbyte);close(clnt_sock);close(serv_sock);return 0;
}
回环地址客户端代码(loopaddrclient2.c)
#includesys/socket.h
#includearpa/inet.h
#includestdio.h
#includestring.h
#include errno.h
#include stdlib.h#define SEND_LEN 1000000int main(){int socksocket(AF_INET,SOCK_STREAM,0); int n 0;int i 0;struct sockaddr_in serv_addr;memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrinet_addr(127.0.0.1);serv_addr.sin_porthtons(9990);if(connect(sock,(struct sockaddr*)serv_addr,sizeof(serv_addr)) 0){perror(connect failed);goto end;}int sendbyte 0;int alreadysendbyte 0;long long allsendbyte 0;char buf[SEND_LEN 1];time_t begin time(NULL);time_t now time(NULL);int continueSeconds 0;while(continueSeconds 100){alreadysendbyte 0;for(i 0; i SEND_LEN; i){buf[i] i 1;}n SEND_LEN;sendbyte send(sock, buf, n, 0);if(sendbyte -1){perror(send error);goto end;}alreadysendbyte sendbyte;while(alreadysendbyte n){sendbyte send(sock, buf alreadysendbyte, n - alreadysendbyte, 0);if(sendbyte -1){perror(send error);goto end;}alreadysendbyte sendbyte;}allsendbyte n;now time(NULL);continueSeconds now - begin;}
end:printf(allsendbyte is %lld\n, allsendbyte);close(sock);return 0;
}
测试结果 单次send字节数为10000时AF_UNIX接收字节数为30240650000127.0.0.1(AF_INET)接收字节数为36394910000。
单次send字节数为100000时AF_UNIX接收字节数为40230300000127.0.0.1(AF_INET)接收字节数为38364400000。
单次send字节数为1000000时AF_UNIX接收字节数为41368000000127.0.0.1(AF_INET)接收字节数为42221000000。
可见AF_UNIX比回环地址并无明显优势