前几天写了个python的每日签到,你运行还得借助crontab,很是不爽.....正好前几天看了个关于c编写daemon进程,加上自己那点可怜的socket知识,于是我们重操旧页,C语言版的每日签到。就是要签到~~~

  关于daemon程序,也叫守护进程,一般运行在后台,我喜欢悄悄的运行。。。。哈哈哈,这个init_daemon.c被大家在网上转来转去,原则都是一样的

Daemon程序设计主要原则包括:

(1)       程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。

(2)       调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。

(3)       设置文件创建mask为0,避免创建文件时权限的影响。

(4)       关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。

(5)       Daemon无法输出信息,可以使用SYSLOG或自己的日志系统进行日志处理。(可选)

(6)       编写管理Daemon的SHELL脚本,使用service对Daemon进行管理和监控。(可选)

  

#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/stat.h>
void init_daemon(void)
{
int pid;
int i; if(pid=fork())
exit();//是父进程,结束父进程
else if(pid< )
exit();//fork失败,退出
//是第一子进程,后台继续执行 setsid();//第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if(pid=fork())
exit();//是第一子进程,结束第一子进程
else if(pid< )
exit();//fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长 for(i=;i< NOFILE;++i)//关闭打开的文件描述符
close(i);
chdir("/tmp");//改变工作目录到/tmp
umask();//重设文件创建掩模
return;
}

这个其实就是个引子,下面的是实体。。

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define IPSTR "1.1.1.1"
#define PORT 80
#define BUFSIZE 1024 void init_daemon(void); //守护进程初始化
int main(int argc, char **argv)
{
FILE *fp;
time_t t;
int sockfd, ret, i, h;
struct sockaddr_in servaddr;
/*
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in{
short sin_family;/*地址族一般来说是 AF_INET
unsigned short sin_port; /* Port number(必须采用网络数据格式,普通数字可以用htons()转换成网络格式的数字)
}
*/
char str1[], str2[], buf[BUFSIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv;
/*
struct timeval{
time_t tv_sec; //seconds
suseconds_t tv_usec; // 毫米 microseconds
}
*/
init_daemon(); //守护进程初始化
while(){
if ((sockfd = socket(AF_INET, SOCK_STREAM, )) < ) {
printf("创建网络连接失败,本线程即将终止---socket error!\n");
exit();
};
/*填写sockadd_in结构*/
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= ){
//inet_pton 将点分十进制IPSTR转换成一个16进制地址,转换错误返回0
/*另一种填写servaddr.sin_addr.addr = inet_addr(IPSTR);*/
printf("地址错误--inet_pton error!\n");
exit();
};
/*尝试连接*/
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < ){
printf("连接到服务器失败,connect error!\n");
exit();
}
//printf("与远端建立了连接\n");
//发送数据
memset(str2, , );
//memset(void *s, int c, size_t n)将参数s的内存前n个字符串用参数c填入,常用做内存控件初始化
strcat(str2, "qdxq=kx&qdmode=1&todaysay=love+is+beautiful.so+beautiful&fastreply=1");
str=(char *)malloc();
len = strlen(str2);
sprintf(str, "%d", len); memset(str1, , );
strcat(str1, "POST http://xxx.xxx.com/plugin.php?identifier=dps_sign&module=sign&operation=qiandao&infloat=1&inajax=1 HTTP/1.1\n");
strcat(str1, "Host: xxx.xxxx.com\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
strcat(str1, "User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36\n");
strcat(str1, "Cookie:你的cookie\n");
strcat(str1, "Content-Length: ");
strcat(str1, str);
strcat(str1, "\n\n"); strcat(str1, str2);
strcat(str1, "\r\n\r\n");
// printf("%s\n",str1); ret = write(sockfd,str1,strlen(str1));
/* write(int fd, const void *buf, size_t count)*/
if (ret < ) {
printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
exit();
}else{
//printf("消息发送成功,共发送了%d个字节!\n\n", ret);
}
/*接受从server端传来的信息*/
//FD_ZERO(&t_set1); //清空套接字集合
//FD_SET(sockfd, &t_set1); //将sockfd加入t_set1集合中
//对fd_set还有种常见用法FD_CLR(fd,&set)将fd从集合中清楚
// printf("%d",sizeof(t_set1));exit(0); result:128Byte = 128*8个fd
//可监控的fd个数取决于sizeof(fd_set)
/*
while(1){
sleep(2);
tv.tv_sec = 0;
tv.tv_usec = 0;
h = 0;
h = select(sockfd +1, &t_set1, NULL, NULL, &tv);
//printf("\n%d",h);exit(0); //results:1 //if (h == 0) continue;
if (h < 0) {
close(sockfd);
printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
return -1;
}; if (h > 0){
memset(buf, 0, 4096);
i= read(sockfd, buf, 4095);
if (i == 0){
close(sockfd);
printf("读取数据报文时发现远端关闭,该线程终止!\n");
return -1;
} printf("%s\n", buf);
} }*/
close(sockfd);
// return 0;
/*写入日志*/ if((fp=fopen("sign.log","a"))>=){
t = time();
fprintf(fp, "l137 was here at %s", asctime(localtime(&t)));
fclose(fp);
}
sleep(); //每四个小时签到,妈妈再也不担心,今天没签到了
}
return ;
}

具体的请求你可以用burp抓个提交包,然后把你的cookie对应的填进去。。http就是一种特殊的socket,大家商量了一下,你用80端口,我也80端口,你按照这个格式发数据,OK,我按照说好的格式解析数据。。。。。

编译的时候gcc -g init_daemon.c bbs_sign.c -o l137

当然我们也可以自己写一个简单的Makefile,简洁大方上档次。。

CC = gcc
all:myapp myapp:
$(CC) -g init_daemon.c bbs_sign.c -o l137
clean:
rm -rf l137

找个小服务器跑下,小程序安安稳稳的运行在后台。。。。。

C语言socket编程--每日签到的更多相关文章

  1. C语言socket编程

    建议先去看一下思路 真的写的很不错呦~ 思路参考博客:https://www.cnblogs.com/renfanzi/p/5713054.html linux c语言socket编程代码(单一服务端 ...

  2. 计算机网络|C语言Socket编程,实现两个程序间的通信

    C语言Socket编程,实现两个程序间的通信 server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的流程图

  3. [转]C语言SOCKET编程指南

    1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...

  4. C语言SOCKET编程指南

    1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...

  5. 多种语言socket编程集锦—win32

    原文 http://www.blogjava.net/huyi2006/articles/263831.html 借此地方整理以下socket编程的多种语言的实现,socket可以跨平台的通信,因此多 ...

  6. C语言Socket编程(计算机网络作业)

    最近我计算机网络课程要做作业了,没办法跟着老师一步一步的写C语言的代码,使用的计算就是Socket通信发送消息:代码实现的功能很简单,客户端向服务器端发送消息,服务器端接收客户端发来的消息,并且输出显 ...

  7. C语言socket编程——linux环境

    先写一个服务器端的监听程序,功能室从客户端读取字符,接收到后告知客户端“I got your message: ”+收到的消息:server.c #include <stdio.h> #i ...

  8. C语言socket编程----实现UDP通信

    TCP/IP协议叫做传输控制/网际协议,又叫做网络通信协议.实际上,它包括上百个功能的协议. 套接字(socket):在网络中用来描述计算机中不同程序与其他计算程序的通信方式. 套接字分为三类; 流式 ...

  9. C语言socket编程----struct sockaddr 和struct sockaddr_in介绍和初始化

    sockaddr结构体 struct  sockaddr{ sa_family_t  sa_family; //地址族,最常用的是"AF_INET"(IPV4)和"AF_ ...

随机推荐

  1. MediaPlayer简单使用,绑定surfaceView实现播放视频的功能

    转载自 Android MediaPlayer使用方法简单介绍 播放音频 android中播放音频可以使用MediaPlayer类来实现,一下是它的一些方法: 方法名 功能描述 setDataSour ...

  2. [转]T4模版引擎之生成数据库实体类

    本文转自:http://www.cnblogs.com/lzrabbit/archive/2012/07/18/2597953.html 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实 ...

  3. 【基本计数方法---加法原理和乘法原理】UVa 11538 - Chess Queen

    题目链接 题意:给出m行n列的棋盘,当两皇后在同行同列或同对角线上时可以互相攻击,问共有多少种攻击方式. 分析:首先可以利用加法原理分情况讨论:①两皇后在同一行:②两皇后在同一列:③两皇后在同一对角线 ...

  4. poj 2553 强连通分支与缩点

    思路:将所有强连通分支找出来,并进行缩点,然后找其中所有出度为0的连通分支,就是题目要求的. #include<iostream> #include<cstdio> #incl ...

  5. php 学习笔记

    //本文转自:http://www.cnblogs.com/ronghua/p/6002995.html //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. ...

  6. Oracle创建表空间、新建用户和授权

    通过pl/sql以sys用户登录到Oracle数据库上,然后执行菜单:文件/新建/命令窗口 ,打开一个命令窗口然后在该命令窗口中执行脚本创建和删除表空间 . 1.创建表空间 格式:  create t ...

  7. CSE(Corrupted State Exceptions) 严重异常处理办法

    原因分析 出现这个问题说明.NET版本至少是4.0,因为微软在.NET 4.0版本中更改了异常处理机制.微软认为catch(Exception)这种写法是不负责任的,程序员应该按照异常严重类别决定程序 ...

  8. Ajax--跨域访问的三种方法

    一.什么是跨域 我们先回顾一下域名地址的组成: / script/jquery.js  http:// (协议号) www  (子域名) google (主域名) (端口号) script/jquer ...

  9. HttpClient(4.3.5) - HTTP Authentication

    HttpClient provides full support for authentication schemes defined by the HTTP standard specificati ...

  10. jquery之css()改变字体大小,颜色,背景色

    转: <script type="text/javascript"> $(document).ready(function() {         $("#f ...