从零开始学习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 
#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);  
}

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


本文转自守住每一天51CTO博客,原文链接:http://blog.51cto.com/liuyu/64075,如需转载请自行联系原作者
相关文章
|
19天前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
2月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
19 0
|
3月前
|
关系型数据库 MySQL 数据库
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
222 0
|
3月前
|
存储 网络协议 安全
C语言 网络编程(五)Socket和端口
Socket 是 TCP/IP 五层网络模型中应用层的编程接口,用于实现不同主机间应用程序的双向通信。它作为网络通信的端点,连接应用层与网络协议栈,提供可靠的流式或非流式数据传输服务。Socket 包括流式(SOCKET_STREAM)、数据报(SOCK_DGRAM)和原始套接字(SOCK_RAW)三种类型,分别适用于不同场景。通过 IP 地址和端口号,Socket 能准确识别并转发数据包至指定进程。端口号分为知名端口(1-1023)、注册端口(1024-49151)和动态端口(49152-65535),确保数据准确交付。
|
4月前
|
编译器 C语言
C语言函数的学习
掌握函数的使用是学习C语言的关键一环,理解和应用这些基本的函数概念将使你能够更有效地利用C语言的强大功能。
26 0
|
5月前
|
网络协议 Java
如何在Java中使用Socket编程实现TCP连接?
在Java中,通过Socket编程实现TCP连接非常常见。以下演示了基本的TCP通信流程,可根据具体需求进行扩展。
309 0
|
6月前
|
存储 编译器 C语言
c语言学习历程【1】
c语言学习历程【1】
82 1
|
6月前
|
C语言
|
6月前
|
C语言
|
6月前
|
C语言
下一篇
DataWorks