您的位置:首页 > 编程语言 > C语言/C++

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


}

欢迎大家进行测试.并指正错误!!!
谢谢!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ linux 职场 休闲 c