从零开始学习C语言(二)之daemon,socket连接
2007-12-25 10:13
459 查看
学无止境,最近学习了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);
}
欢迎大家进行测试.并指正错误!!!
谢谢!!!!
我的意图:读取/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);
}
欢迎大家进行测试.并指正错误!!!
谢谢!!!!
相关文章推荐
- 【android学习记录】socket 连接两个android设备 服务器端
- linux下网络连接socket统计工具ss学习小结
- 从零开始学习C语言(一)之读取文本文件(函数fgets)
- 4.从零开始学习C语言--C语言的输入(scanf)与输出(printf)
- Linux Socket学习--面向非连接的协议
- 【从零开始学习Oracle数据库】(3)函数与子查询和连接查询
- 简单的C语言socket实例(远程连接)
- VMware从零开始学习之21 Horizon View 5.2 通过View Client进行连接测试
- 补.从零开始学习C语言--C语言补充_goto语句
- Androin学习笔记四十二:Java android Socket通信检测(server)连接是否断开
- Java Socket学习(一)——Socket简单连接
- Socket长连接学习
- Socket网络编程学习笔记(2):面向连接的Socket
- 补.从零开始学习C语言--scanf的%c前为什么加空格
- docker daemon的HTTP socket TLS加密连接
- C语言SOCKET学习
- 补.从零开始学习C语言--获取时间函数
- #学习笔记#(59)从零开始学习Nodejs[1]——用Telnet连接Node TCP服务器
- 16.从零开始学习C语言--动态内存分配
- muduo网络库学习之EventLoop(三):Socket、Acceptor、TcpServer、TcpConnection(连接建立,接收消息)