从零开始学习C语言(二)之daemon,socket连接

简介:
学无止境,最近学习了daemon,socket连接的一些知识,写了二段代码.希望有人来点评,指出其中的错误,或需要改进的地点.在写的过程当中,遇到很多问题,不段的问人,在贴求助.查看C手册,查看网上教程才得以写出. 但C的许多基础知识我还是不懂.并不段的在学习.  由于工作繁忙,学习进度实在是小得可怜.. 子 孑  [url]http://zhangjunhd.blog.51cto.com/[/url] 发了很多C语言的基础.在那里我学到了许多知识. 如果打算学习C语言的大家一起吧..我好有个伴.嘿嘿....
 
我的意图:读取/proc//net/dev的数据,在服务器端开启守护进程,当客户端通过socket 进行连接时,输出/proc/net/dev 的流量数据.(数据经过筛选)
 
server.c 
InBlock.gif#include <stdlib.h>  
InBlock.gif#include <stdio.h>  
InBlock.gif#include <errno.h>  
InBlock.gif#include < string.h>  
InBlock.gif#include <netdb.h>  
InBlock.gif#include <sys/types.h>  
InBlock.gif#include <netinet/ in.h>  
InBlock.gif#include <sys/socket.h>  
InBlock.gif#include <syslog.h>  
InBlock.gif#include <unistd.h>   
InBlock.gif#include <netinet/ in.h>    
InBlock.gif#include <sys/socket.h>      
InBlock.gif#include <arpa/inet.h>      
InBlock.gif#include <errno.h>  
InBlock.gif#include <sys/ipc.h>      
InBlock.gif#include <sys/shm.h>  
InBlock.gif /*建立精灵进程*/  
InBlock.gif int daemon_init( void)  
InBlock.gif{ pid_t pid;  
InBlock.gif if((pid = fork()) < 0)  return(-1);  
InBlock.gif else  if(pid != 0) exit(0);  /* parent exit */  
InBlock.gif /* child continues */  
InBlock.gifsetsid();  /* become session leader */  
InBlock.gifchdir( "//tmp"); /* change working directory */  
InBlock.gifumask(0); /* clear file mode creation mask */  
InBlock.gifclose(0); /* close stdin */  
InBlock.gifclose(1); /* close stdout */  
InBlock.gifclose(2); /* close stderr */  
InBlock.gifreturn(0); }  
InBlock.gif/*读取文件数据*/  
InBlock.gifvoid myread(char *buff)  
InBlock.gif{  
InBlock.gifchar buf[1024];  
InBlock.gifFILE *fp;  
InBlock.giffp = fopen("/proc/net/dev""r");  
InBlock.gifif(!fp)  
InBlock.gif {  
InBlock.gifperror("fopen");  
InBlock.gifexit(2);  
InBlock.gif}  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffscanf(fp, "%s", buf);   /*从第三行开始读*/  
InBlock.gifsnprintf(buff, 100, "%s", buf);  
InBlock.giffclose(fp);  
InBlock.gifprintf("%s\n", buf);  
InBlock.gif}  
InBlock.gif  
InBlock.gifint main(int argc, char *argv[])  
InBlock.gif{  
InBlock.gifint sockfd,new_fd;   
InBlock.gifstruct sockaddr_in server_addr;  
InBlock.gifstruct sockaddr_in client_addr;  
InBlock.gifint sin_size,portnumber;  
InBlock.gifchar hello[1024];  
InBlock.gif/* 服务器端开始建立socket描述符 */  
InBlock.gifif((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)  
InBlock.gif{  
InBlock.gifprintf("Socket error:%s\n\a",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gif/* 服务器端填充 sockaddr_in结构 */  
InBlock.gifbzero(&server_addr,sizeof(struct sockaddr_in));  
InBlock.gifserver_addr.sin_family=AF_INET;  
InBlock.gifserver_addr.sin_addr.s_addr=inet_addr("本机IP");      
InBlock.gifserver_addr.sin_port=htons(10240); /*端口号转换为网络字节序*/  
InBlock.gif/* 捆绑sockfd描述符 */  
InBlock.gifif(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==  
InBlock.gif-1)  
InBlock.gif{  
InBlock.gifprintf("Bind error:%s\n\a",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gif/* 监听sockfd描述符 */  
InBlock.gifif(listen(sockfd,5)==-1) /*5为请求队列的最大请求数*/  
InBlock.gif{  
InBlock.gifprintf("Listen error:%s\n\a",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gifwhile(1)  
InBlock.gif{  
InBlock.gif/* 服务器阻塞,直到客户程序建立连接 */  
InBlock.gifsin_size=sizeof(struct sockaddr_in);  
InBlock.gifif((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size  
InBlock.gif))==-1)  
InBlock.gif{  
InBlock.gifprintf("Accept error:%s\n\a",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gif/*inet_ntoa的作用是将一个32位Ipv4地址转换为相应的点分十进制数串*/  
InBlock.gifprintf("Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));  
InBlock.gif/*向客户端发送hello字符数组的内容*/  
InBlock.gifmyread(hello);  
InBlock.gifif(write(new_fd,hello,strlen(hello))==-1)  
InBlock.gif{  
InBlock.gifprintf("Write Error:%s\n",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gif/* 这个通讯已经结束 */  
InBlock.gifclose(new_fd);  
InBlock.gif}/* while结尾处*/  
InBlock.gifclose(sockfd);  
InBlock.gifexit(0);  
InBlock.gif}  
InBlock.gif 
InBlock.gif  

client.c 
InBlock.gif#include <stdlib.h>  
InBlock.gif#include <stdio.h>  
InBlock.gif#include <errno.h>  
InBlock.gif#include < string.h>                   
InBlock.gif#include <netdb.h>  
InBlock.gif#include <sys/types.h>  
InBlock.gif#include <netinet/ in.h>  
InBlock.gif#include <sys/socket.h>  
InBlock.gif#include <netdb.h>  
InBlock.gif int main( int argc,  char *argv[])  
InBlock.gif{  
InBlock.gif int sockfd;  
InBlock.gif char buffer[1024];  
InBlock.gif struct sockaddr_in server_addr;  
InBlock.gif struct hostent *host;  
InBlock.gif int portnumber,nbytes;  
InBlock.gif  
InBlock.gif /* 客户程序开始建立 sockfd描述符 */  
InBlock.gif if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)  
InBlock.gif{  
InBlock.gifprintf( "Socket Error:%s\a\n",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gif /* 客户程序填充服务端的资料 */  
InBlock.gifbzero(&server_addr, sizeof(server_addr));  
InBlock.gifserver_addr.sin_family=AF_INET;  
InBlock.gifserver_addr.sin_port=htons(10240); /*主机字节序转换为网络字节序*/  
InBlock.gifserver_addr.sin_addr.s_addr=inet_addr( "server端IP");  
InBlock.gif /* 客户程序发起连接请求 */  
InBlock.gif if(connect(sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr))==-1)  
InBlock.gif{  
InBlock.gifprintf( "Connect Error:%s\a\n",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gif /* 连接成功了 */  
InBlock.gif if((nbytes=read(sockfd,buffer,1024))==-1)  
InBlock.gif{  
InBlock.gifprintf( "Read Error:%s\n",strerror(errno));  
InBlock.gifexit(1);  
InBlock.gif}  
InBlock.gifbuffer[nbytes]='\0';  
InBlock.gifprintf( "%s\n",buffer);  
InBlock.gif /* 结束通讯 */  
InBlock.gifclose(sockfd);  
InBlock.gifexit(0);  
InBlock.gif}

 
 
欢迎大家进行测试.并指正错误!!!
谢谢!!!!


本文转自守住每一天51CTO博客,原文链接:http://blog.51cto.com/liuyu/64075,如需转载请自行联系原作者
相关文章
|
1天前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
1天前
|
编译器 程序员 开发工具
c语言从入门到实战——在系统学习C语言之前所需要了解的知识
C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归等功能,其设计提供了低级别的存取权限,并且要求程序员管理所有的内存细节。C语言的基本构成包括数据类型(如整型、浮点型、字符型等)、运算符(如算术运算符、关系运算符、逻辑运算符等)、控制结构(如顺序结构、选择结构、循环结构等)以及函数等。此外,C语言还提供了指针的概念,这是其他许多编程语言所不具备的。指针是一个变量,其值为另一个变量的地址,通过指针可以间接访问和操作内存中的数据。C语言也支持数组、结构体、联合体等复合数据类型,以及文件操作、动态内存分配等高级功能。
54 0
|
1天前
|
存储 C语言
通俗易懂的学习C语言中输入一组数并找出其最大值
通俗易懂的学习C语言中输入一组数并找出其最大值
|
1天前
|
网络协议 安全 Python
python中socket客户端关闭连接
【4月更文挑战第7天】本教程介绍了如何在TCP客户端中正确关闭连接。使用`close()`方法可关闭Socket连接并释放资源,示例代码显示了在正常和异常情况下关闭连接的方法。注意异常处理以确保在任何情况下都能关闭连接,并避免并发操作同一Socket,以保证连接的稳定和安全。掌握这些技巧对编写健壮的TCP客户端至关重要。
|
1天前
|
人工智能 测试技术 C语言
C语言学习
C语言学习
14 1
|
1天前
|
Java 关系型数据库 数据库连接
【C 言专栏】C 语言与数据库的连接与操作
【5月更文挑战第2天】本文探讨了C语言如何连接和操作数据库,介绍了数据库连接的基本原理,如通过ODBC、JDBC或原生接口与数据库交互。文章详细阐述了使用ODBC连接的步骤,并列举了C语言在数据库操作中的常见任务,强调了错误处理、数据类型匹配和性能优化的重要性。通过实际案例,展示了在学生信息管理系统中应用C语言与数据库交互的过程。本文旨在帮助读者更好地理解和应用C语言进行数据库管理。
|
1天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
1天前
|
网络协议 安全 Java
python中socket关闭连接和释放资源
【4月更文挑战第6天】本教程讲解了网络通信后如何正确关闭连接和释放资源,以保证程序稳定性、性能及避免资源泄露和安全问题。内容涵盖TCP、HTTP连接关闭,数据库连接释放,以及内存、文件句柄、线程等资源管理。建议使用异常处理、遵循编程语言最佳实践,并定期审查代码以优化资源管理。
|
1天前
|
机器学习/深度学习 人工智能 Java
学习Python语言好还是C语言好
学习Python语言好还是C语言好
22 0
|
1天前
|
C语言
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
83 0