从零开始学习C语言(二)之daemon,socket连接
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://liuyu.blog.51cto.com/183345/64075 |
学无止境,最近学习了daemon,socket连接的一些知识,写了二段代码.希望有人来点评,指出其中的错误,或需要改进的地点.在写的过程当中,遇到很多问题,不段的问人,在贴求助.查看C手册,查看网上教程才得以写出. 但C的许多基础知识我还是不懂.并不段的在学习. 由于工作繁忙,学习进度实在是小得可怜.. 子 孑 http://zhangjunhd.blog.51cto.com/发了很多C语言的基础.在那里我学到了许多知识. 如果打算学习C语言的大家一起吧..我好有个伴.嘿嘿....
我的意图:读取/proc//net/dev的数据,在服务器端开启守护进程,当客户端通过socket 进行连接时,输出/proc/net/dev 的流量数据.(数据经过筛选) server.c #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <syslog.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h> #include <sys/ipc.h> #include <sys/shm.h> /*建立精灵进程*/ int daemon_init(void) { pid_t pid; if((pid = fork()) < 0) return(-1); else if(pid != 0) exit(0); /* parent exit */ /* child continues */ setsid(); /* become session leader */ chdir("//tmp"); /* change working directory */ umask(0); /* clear file mode creation mask */ close(0); /* close stdin */ close(1); /* close stdout */ close(2); /* close stderr */ return(0); } /*读取文件数据*/ void myread(char *buff) { char buf[1024]; FILE *fp; fp = fopen("/proc/net/dev", "r"); if(!fp) { perror("fopen"); exit(2); } fgets(buf, 1024, fp); fgets(buf, 1024, fp); fgets(buf, 1024, fp); fgets(buf, 1024, fp); fscanf(fp, "%s", buf); /*从第三行开始读*/ snprintf(buff, 100, "%s", buf); fclose(fp); printf("%s\n", buf); } int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[1024]; /* 服务器端开始建立socket描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { printf("Socket error:%s\n\a",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr_in结构 */ bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=inet_addr("本机IP"); server_addr.sin_port=htons(10240); /*端口号转换为网络字节序*/ /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))== -1) { printf("Bind error:%s\n\a",strerror(errno)); exit(1); } /* 监听sockfd描述符 */ if(listen(sockfd,5)==-1) /*5为请求队列的最大请求数*/ { printf("Listen error:%s\n\a",strerror(errno)); exit(1); } while(1) { /* 服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(struct sockaddr_in); if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size ))==-1) { printf("Accept error:%s\n\a",strerror(errno)); exit(1); } /*inet_ntoa的作用是将一个32位Ipv4地址转换为相应的点分十进制数串*/ printf("Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); /*向客户端发送hello字符数组的内容*/ myread(hello); if(write(new_fd,hello,strlen(hello))==-1) { printf("Write Error:%s\n",strerror(errno)); exit(1); } /* 这个通讯已经结束 */ close(new_fd); }/* while结尾处*/ close(sockfd); exit(0); } client.c #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <netdb.h> int main(int argc, char *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; /* 客户程序开始建立 sockfd描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { printf("Socket Error:%s\a\n",strerror(errno)); exit(1); } /* 客户程序填充服务端的资料 */ bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(10240);/*主机字节序转换为网络字节序*/ server_addr.sin_addr.s_addr=inet_addr("server端IP"); /* 客户程序发起连接请求 */ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { printf("Connect Error:%s\a\n",strerror(errno)); exit(1); } /* 连接成功了 */ if((nbytes=read(sockfd,buffer,1024))==-1) { printf("Read Error:%s\n",strerror(errno)); exit(1); } buffer[nbytes]='\0'; printf("%s\n",buffer); /* 结束通讯 */ close(sockfd); exit(0); } 欢迎大家进行测试.并指正错误!!! 谢谢!!!! 本文出自 “seven” 博客,请务必保留此出处http://liuyu.blog.51cto.com/183345/64075 本文出自 51CTO.COM技术博客 |



#include <stdlib.h>
守住每一天
博客统计信息
热门文章
最新评论
友情链接


