gSOAP代码框架与fastcgi的问题


使用gSOAP代码框架开发onvif时,由于我用的是lighttpd做前端web server,用gsoap生成的代码做后端,使用fastcgi进行连接。

不过发现gsoap的代码的debug支持在使用fastcgi的情况下无效了,经检查,发现问题是引用的fcgi_stdio.h里面的宏定义冲掉了原本写log的操作。

// fcgi_stdio.h
#define fprintf FCGI_fprintf
这样一来,原本写log的语句就变成了


DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p));

//gcc -DWITH_FASTCGI -E stdsoap2.c

{ if (soap) { if (!soap->fdebug[(2)]) soap_open_logfile((struct soap*)soap, (2)); if (soap->fdebug[(2)]) { FCGI_FILE *fdebug = soap->fdebug[(2)]; FCGI_fprintf(fdebug, "Mo
..."); FCGI_fflush(fdebug); } }};
所以log功能无效了。


解决这个问题的方法很简单,fcgi_stdio.h里有个宏开关NO_FCGI_DEFINES,用来关闭这些替换

不过这样一来,有一些原本要替换掉的宏反而无效了,这里需要把这些要替换掉的宏找出来,手动替换成FCGX_xxx.

在2.8.15的版本上,我做的修改是:

stdsoap2.c

680,687c680,682
< #if defined(WITH_FASTCGI)
< #if defined(NO_FCGI_DEFINES)
<       nwritten = FCGI_fwrite((void*)s, 1, n, (&_fcgi_sF[1]));
<       FCGI_fflush((&_fcgi_sF[1]));
< #else
<         nwritten = fwrite((void*)s, 1, n, stdout);
<         fflush(stdout);
< #endif
---
> #ifdef WITH_FASTCGI
>       nwritten = fwrite((void*)s, 1, n, stdout);
>       fflush(stdout);
1000,1003c995
< #if defined(WITH_FASTCGI)
< #if defined(NO_FCGI_DEFINES)
<   return FCGI_fread(s, 1, n, (&_fcgi_sF[0]));
< #else
---
> #ifdef WITH_FASTCGI
1005d996
< #endif
5047,5049d5037
< #if defined(WITH_FASTCGI) && defined(NO_FCGI_DEFINES)
<   { if (soap->FCGI_fclose && (soap->error = soap->FCGI_fclose(soap)))
< #else
5051d5038
< #endif
5160,5163d5146
< #ifdef NO_FCGI_DEFINES
<   soap->FCGI_fopen = tcp_connect;
<   soap->FCGI_fclose = tcp_disconnect;
< #else
5166d5148
< #endif
7520,7522d7501
< #ifdef NO_FCGI_DEFINES
<               FCGI_fprintf((&_fcgi_sF[2]), "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr);
< #else
7524d7502
< #endif
8838,8841d8815
< #ifdef NO_FCGI_DEFINES
<   soap->FCGI_fopen = tcp_connect;
<   soap->FCGI_fclose = tcp_disconnect;
< #else
8844d8817
< #endif
12880a12854
>
15422,15424d15395
< #if defined(WITH_FASTCGI) && defined(NO_FCGI_DEFINES)
<   if (soap->FCGI_fopen && *soap->host)
< #else
15426d15396
< #endif
15440,15442d15409
< #if defined(WITH_FASTCGI) && defined(NO_FCGI_DEFINES)
<         { soap->socket = soap->FCGI_fopen(soap, endpoint, soap->host, soap->port);
< #else
15444d15410
< #endif

stdsoap2.h

768,769c764
< #define NO_FCGI_DEFINES
< #include "fcgi_stdio.h"
---
> # include <fcgi_stdio.h>
1942,1944d1936
< #ifdef NO_FCGI_DEFINES
<   int (*FCGI_fopen)(struct soap*, const char*, const char*, int);
< #else
1946d1937
< #endif
1948,1950d1938
< #ifdef NO_FCGI_DEFINES
<   int (*FCGI_fclose)(struct soap*);
< #else
1952d1939
< #endif


额外的需要注意的是log文件权限问题,需要让用户lighttpd可读写。

你可能感兴趣的:(gSOAP代码框架与fastcgi的问题)