c写的CGI怎么实现session_start 和session_end功能?

zero1977 2002-12-13 03:02:34
???
...全文
178 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocrazy 2003-04-28
  • 打赏
  • 举报
回复
如果普通的web应用完全能使用cookie实现,记录登录时的时间,
liushukai810627 2003-01-15
  • 打赏
  • 举报
回复
真高.我是服了你们了
walkany 2003-01-15
  • 打赏
  • 举报
回复
取得用户的特征信息然后写到服务器的一个临时文件中,然后,等到下次用户请求服务器的时候,服务器就找到特殊的文件作处理.这是我的理解,不知道正确与否.
walkany 2003-01-13
  • 打赏
  • 举报
回复

int cgi_session_alter_var(const char *name, const char *new_value)
{
register formvars *data;
unsigned int value_len;

data = sess_list_start;
while (data) {
if (!strcmp(data->name, name)) {
value_len = strlen(new_value) + 1;

if (value_len > strlen(data->value)) {
data->value = realloc(data->value, value_len+1);
if (!data->value)
libcgi_error(E_MEMORY, "%s, line %s", __FILE__, __LINE__);

}

strncpy(data->value, new_value, value_len);
data->value[value_len] = '\0';

sess_file_rewrite();

return 1;
}


data = data->next;
}

session_lasterror = SESS_VAR_NOT_REGISTERED;

return 0;
}

int cgi_session_var_exists(const char *name)
{
if (!List_item(name, sess_list_start)) {
session_lasterror = SESS_VAR_NOT_REGISTERED;
return 0;
}

return 1;
}

// Unregister a session variable ( destroying its value )
int cgi_session_unregister_var(char *name)
{
if (!sess_initialized) {
session_lasterror = SESS_NOT_INITIALIZED;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}

if (!List_delete(name, &sess_list_start, &sess_list_last)) {
session_lasterror = SESS_REMOVE_FROM_LIST;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}

if (!sess_file_rewrite())

return 0;

return 1;
}

int cgi_session_start()
{
char *buf = NULL, *sid = NULL;
FILE *fp;
size_t total;

if (sess_initialized) {
session_lasterror = SESS_STARTED;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}

if (headers_initialized) {
session_lasterror = SESS_HEADERS_SENT;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}

// Get the session ID
sid = cgi_cookie_value(SESSION_COOKIE_NAME);

// If there isn't a session ID, we need to create one
if (sid == NULL) {
if (sess_create_file()) {
cgi_add_cookie(SESSION_COOKIE_NAME, sess_id, 0, 0, 0, 0);

sess_initialized = 1;

return 1;
}
return 1;
}

return 0;
}
// Make sure the file exists
else {
save_path_len = strlen(SESSION_SAVE_PATH) + strlen(SESSION_FILE_PREFIX);

sess_fname = (char *)malloc(save_path_len + SESS_ID_LEN + 1);
if (!sess_fname)
libcgi_error(E_MEMORY, "File %s, line %s", __FILE__, __LINE__);

snprintf(sess_fname, (SESS_ID_LEN + save_path_len + 1), "%s%s%s", SESSION_SAVE_PATH, SESSION_FILE_PREFIX, sid);
sess_fname[SESS_ID_LEN + save_path_len] = '\0';

errno = 0;
fp = fopen(sess_fname, "r");
if (errno == ENOENT) {
// The file doesn't exists. Create a new session
if (sess_create_file()) {
cgi_add_cookie(SESSION_COOKIE_NAME, sess_id, 0, 0, 0, 0);

libcgi_error(E_WARNING, "Session Cookie exists, but file don't. A new one was created.");
sess_initialized = 1;

return 1;
}

return 0;
}
}

// Well, at this point we've the session ID
strncpy(sess_id, sid, SESS_ID_LEN);
sess_id[SESS_ID_LEN] = '\0';

// Gets the line containing session data
getline(&buf, &total, fp);

if (buf != NULL && strlen(buf) > 1)
if (buf != NULL && strlen(buf) > 1)
process_data(buf, &sess_list_start, &sess_list_last, '=', ';');

fclose(fp);
sess_initialized = 1;

return 1;
}
walkany 2003-01-13
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#include "cgi.h"
#include "session.h"
#include "error.h"

// session id length
#define SESS_ID_LEN 45

// File pointer to session file in the server
FILE *sess_file;

static char sess_id[SESS_ID_LEN + 1];
static char *sess_fname;
static unsigned int save_path_len;

int sess_initialized = 0;; // true if the session has been initialized, otherwise false
int sess_finitialized = 0; // true if the session file has been created, otherwirte false
int session_lasterror = 0;

// cgi.c
extern int headers_initialized;
extern void libcgi_error(int error_code, const char *msg, ...);
extern formvars *process_data(char *query, formvars **start, formvars **last, const char delim, const char sep);

extern size_t getline(char **lineptr, size_t *n, FILE *stream);

// Error types
typedef enum SESS_ERROR {
SESS_NOT_INITIALIZED,
SESS_FILE_NOT_INITIALIZED,
SESS_HEADERS_SENT,
SESS_STARTED,
SESS_CREATE_FILE,
SESS_DELETE_FILE,
SESS_DESTROY,
SESS_REMOVE_FROM_LIST,
SESS_VAR_REGISTERED,
SESS_VAR_NOT_REGISTERED,
SESS_OPEN_FILE
} sess_error;

// This variables are used to control the linked list of all
// session objects. Most of time you don't need to use them
// directly
formvars *sess_list_start = NULL;
formvars *sess_list_last = NULL;

// Generate a session "unique" id
void sess_generate_id()
{
static char table[] = "123456789abcdefghijlmnopqrstuvxzwyABCDEFGHIJLMOPQRSTUVXZYW";
unsigned int len = strlen(table);
register int i;

save_path_len = strlen(SESSION_SAVE_PATH) + strlen(SESSION_FILE_PREFIX);

sess_fname = (char *)malloc(save_path_len + SESS_ID_LEN + 1);
if (!sess_fname)
libcgi_error(E_MEMORY, "File %s, line %s", __FILE__, __LINE__);

for (i = 0; i < SESS_ID_LEN; i++)
sess_id[i] = table[rand()%len];
sess_id[SESS_ID_LEN] = '\0';


snprintf(sess_fname, (SESS_ID_LEN + save_path_len + 1), "%s%s%s", SESSION_SAVE_PATH, SESSION_FILE_PREFIX, sess_id);
sess_fname[SESS_ID_LEN + save_path_len] = '\0';
}

int sess_create_file()
{
// timeval, gettimeofday are used togheter with srand() function
struct timeval tv;

gettimeofday(&tv, NULL);
srand(tv.tv_sec * tv.tv_usec * 100000);

sess_generate_id();
sess_file = fopen(sess_fname, "w");
if (!sess_file) {
session_lasterror = SESS_CREATE_FILE;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}

// Changes file permission to 0600
chmod(sess_fname, S_IRUSR|S_IWUSR);
fclose(sess_file);

return 1;
}

// Destroy the session, including all data
// After session_destroy() was called, is not more
// possible to use session functions before an another
// call to session_start()
int cgi_session_destroy()
{
// Remember: unlink() returns 0 if success :)
if (!unlink(sess_fname)) {
sess_finitialized = 0;
List_free(&sess_list_start);

// hhhmmm..
if (headers_initialized)
libcgi_error(E_WARNING, "Headers alreay sent. session_destroy() can't fully unregister the session");
else
cgi_add_cookie(SESSION_COOKIE_NAME, "", 0, 0, 0, 0);

return 1;
}
else {
session_lasterror = SESS_DESTROY;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}
}

int sess_file_rewrite()
{
formvars *data;

cgi_init_headers();

// Rewrites all data to session file
sess_file = fopen(sess_fname, "w");

if (!sess_file) {
session_lasterror = SESS_OPEN_FILE;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);


return 0;
}

data = sess_list_start;

if (data != NULL) {
fprintf(sess_file, "%s=%s", data->name, data->value);
data = data->next;

if (data) {
while (data) {
fprintf(sess_file, ";%s=%s", data->name, data->value);
data = data->next;
}
}
}

fclose(sess_file);

return 1;
}


// Register a variable into current opened session
// Note that we are opening and closing the session file
// every time this function is called... ( I/O ** 1000000 :-/ )
int cgi_session_register_var(const char *name, const char *value)
{
formvars *data;

if (!sess_initialized) {
session_lasterror = SESS_NOT_INITIALIZED;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}
if (!cgi_session_var_exists(name)) {
sess_file = fopen(sess_fname, "a");
if (!sess_file) {
session_lasterror = SESS_OPEN_FILE;

libcgi_error(E_WARNING, session_error_message[session_lasterror]);

return 0;
}

data = (formvars *)malloc(sizeof(formvars));
if (!data)
libcgi_error(E_MEMORY, "%s, line %s", __FILE__, __LINE__);

data->name = (char *)malloc(strlen(name) + 1);
if (!data->name)
libcgi_error(E_MEMORY, "%s, line %s", __FILE__, __LINE__);

data->value = (char *)malloc(strlen(value) + 1);

if (!data->value) {
free(data->name);

libcgi_error(E_MEMORY, "%s, line %s", __FILE__, __LINE__);
}

strncpy(data->name, name, strlen(name));
data->name[strlen(name)] = '\0';

strncpy(data->value, value, strlen(value));
data->value[strlen(value)] = '\0';

if (!sess_list_last)
fprintf(sess_file, "%s=%s", name, value);
else
fprintf(sess_file, ";%s=%s", name, value);

List_add(data, &sess_list_start, &sess_list_last);

fclose(sess_file);

fclose(sess_file);
return 1;
}

session_lasterror = SESS_VAR_REGISTERED;

return 0;
}
zjing9464 2003-01-07
  • 打赏
  • 举报
回复
为什么不用isapi呢~
walkany 2003-01-03
  • 打赏
  • 举报
回复
这和你的WEB server有关系,在Apache里面,它为每次请求建立一个进程,因此同一个终端发出的请求会被不同的进程处理,Session就不太容易实现.但是在IIS里面应好像不是为每一个请求建立一个进程,这样就可能有建立进程的功能.不关怎样,首先是WEB server要提供这种功能,你才可以作进一步的开发.
walkany 2003-01-03
  • 打赏
  • 举报
回复
我正在准备用C来开发一个网站,能否交流交流?我的e_mail是yangyou666@sina.com.你是在哪个城市工作阿?
erx 2003-01-01
  • 打赏
  • 举报
回复
开始时给b端一个时间戳,或者保存在?后面或者是cookie,
然后……


这种问题你也能问的出来,强!
ykj76 2002-12-25
  • 打赏
  • 举报
回复
up
Jakecat 2002-12-22
  • 打赏
  • 举报
回复
具体怎么做?
我正在开发一个用c写的cgi类库
jinandsun 2002-12-14
  • 打赏
  • 举报
回复
都一样吧
HTTP不是C/S不是连接的,所以需要程序自己做会话的~
判断在线时间等等~
很简单~

2,203

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧