如何用c语言写cgi程序,第1张

包括标准输入、环境变量、标准输出三部分。

1标准输入

CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,这就是所谓的向CGI程序传递数据的 POST方法。这意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。POST方法是常用的方法,本文将以此方法为例,分析CGI程序设 计的方法、过程和技巧。

2环境变量

操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI 程序传递一些重要的参数。CGI的GET方法还通过 环境变量QUERY-STRING向CGI程序传递Form中的数据。

3标准输出

CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。

下面是一个简单的CGI程序,它将HT

如果是学习的话我推荐你去看看Linux、FreeBSD系统中与网络有关的那些命令程序的代码,比如ping、tcpdump等等,他们还有很多更强大的开源替代方案,比如mtr,都是学习的好材料。这些程序都追求把一件事情做到极致,所以往往结构清晰却又不会过于简单,你看看光是下载就有wget和curl两大神器够你折腾了。Linux和FreeBSD的这类自带命令虽然功能相同,但往往实现方式有很大差别,对比阅读效果甚好。

ebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写,代码实在太简洁,源码加起来不到600行。下载链接:GitHub-EZLippi/WebBench

Tinyhttpd是一个超轻量型HttpServer,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个HttpServer的本质。下载链接链接:GitHub-EZLippi/Tinyhttpd

高性能web服务器nginx:download

C语言写的事件驱动框架libevent/libevent·GitHub

ACE:C++面向对象网络变成工具包

BoostAsio:用于网络和底层I/O编程的跨平台的C++库

Casablanca:C++RESTSDK

cpp-netlib:高级网络编程的开源库集合

Dyadc:C语言的异步网络

libcurl:多协议文件传输库

Mongoose:非常轻量级的网络服务器

Muduo:用于Linux多线程服务器的C++非阻塞网络库

net_skeleton:C/C++的TCP客户端/服务器库

nopec:基于C语言的超轻型软件平台,用于可扩展的服务器端和网络应用。对于C编程人员,可以考虑nodejs

Onion:C语言HTTP服务器库,其设计为轻量级,易使用。

POCO:用于构建网络和基于互联网应用程序的C++类库,可以运行在桌面,服务器,移动和嵌入式系统。

RakNet:为游戏开发人员提供的跨平台的开源C++网络引擎。

Tufo:用于Qt之上的C++构建的异步Web框架。

WebSocket++:基于C++/BoostAiso的websocket客户端/服务器库

ZeroMQ:高速,模块化的异步通信库

这个网站整理的比较全,可以看看ezlippicom的页面另外编写高性能web服务器当然离不开缓存啦,可以关注下Redis和Memcached

c语言一共有21个什么?

1《C语言入门教程》:引入大量的C语言程序案例,把算法和语法结合起来,通过引导大家由浅入深地编写C程序,让大家掌握C语言。将从中学会C语言语法、数组、模块化程序设计指针、文件的输入与输出等。

2《C语言实现文件类型统计程序》:使用C语言实现一个文件类型统计程序。

3《C语言实现多线程排序》:使用C语言多线程模型实现了排序算法。

4《3个C语言实例带你掌握递归方法论》:通过3个C语言编程实例,让你在利用递归解决实际问题的过程中学习递归并掌握其核心思想。

5《C语言实现LRU缓存》:使用C语言实现LRU缓存,从中学习LRU缓存的基本概念、C语言相关编程技巧,双向链表的C语言实现以及哈希表的C语言实现。6《C语言实现通讯录》:使用C语言完成一个简单的通讯录。会涉及到结构体、数组、链表等重要概念。

7《C语言制作简单计算器》:用C语言做一个简单的计算器,进行加、减、乘、除操作。学习C语言的基本语法,与输入与输出。

8《C语言实现大数计算器(加减乘除)》:通过C语言实现一个简易计算器,用于解决任意长度的有符号整数的加、减、乘、除运算。将利用全新的数据结构来表示大数,并将新数据结构存储的大数转化为字符用于显示。以及基于大数新的数据结构完成加、减、乘、除的计算算法设计。9《C语言实现聊天室软件》:使用C语言实现聊天室软件,学习并实践基本的Linuxsocket通信的相关技术,加深对TCP/IP协议栈的理解。

10《C语言实现web服务器》:使用C语言实现一个Web服务器。将会学习C语言网络开发,epollIO复用机制,熟悉Linux下的C语言程序编译方法,Makefile编写等技11《C语言实现Linuxpwd命令》:通过实现linuxpwd命令,以理解linux文件系统的基本概念及内部实现,并熟悉linux系统与文件系统相关的系统调用接口。

12《C语言实现FTP服务器》:更加深入的理解套接字编程模型,并且了解应用层协议(FTP)如何在套接字基础上定义。本项目实现了支持list,get,quit等命令的FTP服务器。

13《C语言实现Linuxwho命令》:通过C语言实现Linuxwho命令项目的学习,可以掌握Linux操作系统为上层提供的访问系统数据文件的接口。更好的理解Linux操作系统工作的原理。

14《C语言实现Linuxcp命令》:通过完成C语言实现Linuxcp命令项目的学习,可以掌握Linux操作系统中的文件IO相关的系统函数和目录相关操作的系统函数,比如open,write,opendir,readir。深入了解Linux环境系统编程。

15《C语言实现Linuxls命令》:本课程学习linux目录与文件属性,使用C语言实现Linuxls命令。其中涉及到ls的原理,如何获取获取文件的属性,掩码的相关知识。认识linux系统函数opendir(),readdir()等的调用方法。

16《C语言实现Linuxtouch命令》:通过完成一个C语言实现Linuxtouch命令项目,学习基于LINUX环境的系统编程技术,尤其Linux文件IO操作相关技术。能。17《C语言实现ping程序》:带领你学习用C语言实现ping命令。通过本项目中你可以更深入地理解TCP/IP协议,套接字编程,掌握C语言进行网络编程的技巧方法。

18《C语言版FlappyBird》:使用C语言来实现一个字符版FlappyBird,感受不一样的风采。本课程学习后将会熟悉C语言,以及绘图库ncurses的使用。本课程适合有C语言基础,想做练手项目的同学,可以有效的学习ncurses绘图库的使用,做一些有趣的事情。19《C语言实现贪吃蛇》:将在Linux平台使用C语言编程,在终端界面上玩贪吃蛇。分为三个阶段,一阶段图像库,二阶段绘制游戏图像界面,三阶段实现贪吃蛇。逐步实现一个游戏的制作过程。

20《C语言快速实现五子棋》:用最简单的代码来实现五子棋游戏,帮助大家复习基础知识,学习了如何设计并实现一个五子棋游戏,巩固大家的基础知识。涉及到C语言的基础逻辑判断,程序设计与编写。21《C语言制作2048》:2048是之前十分火爆的一款益智游戏。将使用C语言完成一个2048游戏。适合对C语言有一定基础,想做项目练手的同学,本课程学习后将会了解C语言,以及绘图库ncurses的实用。

tcp连接服务器和客户端的端口

端口:1

服务:tcpmux

说明:这显示有人在寻找sgiirix机器。irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开。irix机器在发布是含有几个默认的无密码的帐户,如:ip、guestuucp、nuucp、demos、tutor、diag、outofbox等。许多管理员在安装后忘记删除这些帐户。因此hacker在internet上搜索tcpmux并利用这些帐户。

端口:7

服务:echo

说明:能看到许多人搜索fraggle放大器时,发送到xxx0和xxx255的信息。

端口:19

服务:charactergenerator

说明:这是一种仅仅发送字符的服务。udp版本将会在收到udp包后回应含有字符的包。tcp连接时会发送含有字符的数据流直到连接关闭。hacker利用ip欺骗可以发动dos攻击。伪造两个chargen服务器之间的udp包。同样fraggledos攻击向目标地址的这个端口广播一个带有伪造受害者ip的数据包,受害者为了回应这些数据而过载。

端口:21

服务:ftp

说明:ftp服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的ftp服务器的方法。这些服务器带有可读写的目录。木马dolytrojan、fore、invisibleftp、webex、wincrash和bladerunner所开放的端口。

端口:22

服务:ssh

说明:pcanywhere建立的tcp和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用rsaref库的版本就会有不少的漏洞存在。

端口:23

服务:telnet

说明:远程登录,入侵者在搜索远程登录unix的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马tinytelnetserver就开放这个端口。

端口:25

服务:smtp

说明:smtp服务器所开放的端口,用于发送邮件。入侵者寻找smtp服务器是为了传递他们的spam。入侵者的帐户被关闭,他们需要连接到高带宽的e-mail服务器上,将简单的信息传递到不同的地址。木马antigen、emailpasswordsender、haebucoceda、shtrilitzstealth、winpc、winspy都开放这个端口。

端口:31

服务:msgauthentication

说明:木马masterparadise、hackersparadise开放此端口。

端口:42

服务:winsreplication

说明:wins复制

端口:53

服务:domainnameserver(dns)

说明:dns服务器所开放的端口,入侵者可能是试图进行区域传递(tcp),欺骗dns(udp)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。

端口:67

服务:bootstrapprotocolserver

说明:通过dsl和cablemodem的防火墙常会看见大量发送到广播地址255255255255的数据。这些机器在向dhcp服务器请求一个地址。hacker常进入它们,分配一个地址把自己作为局部路由器而发起大量中间人(man-in-middle)攻击。客户端向68端口广播请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的ip地址。

端口:69

服务:trivalfiletransfer

说明:许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使入侵者能从系统中窃取任何文件。它们也可用于系统写入文件。

端口:79

服务:fingerserver

说明:入侵者用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器finger扫描。

端口:80

服务:http

说明:用于网页浏览。木马executor开放此端口。

端口:99

服务:metagramrelay

说明:后门程序ncx99开放此端口。

端口:102

服务:messagetransferagent(mta)-x400overtcp/ip

说明:消息传输代理。

端口:109

服务:postofficeprotocol-version3

说明:pop3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。pop3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。

端口:110

服务:sun公司的rpc服务所有端口

说明:常见rpc服务有rpcmountd、nfs、rpcstatd、rpccsmd、rpcttybd、amd等

端口:113

服务:authenticationservice

说明:这是一个许多计算机上运行的协议,用于鉴别tcp连接的用户。使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务的记录器,尤其是ftp、pop、imap、smtp和irc等服务。通常如果有许多客户通过防火墙访问这些服务,将会看到许多这个端口的连接请求。记住,如果阻断这个端口客户端会感觉到在防火墙另一边与e-mail服务器的缓慢连接。许多防火墙支持tcp连接的阻断过程中发回rst。这将会停止缓慢的连接。

端口:119

服务:networknewstransferprotocol

说明:news新闻组传输协议,承载usenet通信。这个端口的连接通常是人们在寻找usenet服务器。多数isp限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送spam。

端口:135

服务:本地service

说明:microsoft在这个端口运行dcerpcend-pointmapper为它的dcom服务。这与unix111端口的功能很相似。使用dcom和rpc的服务利用计算机上的end-pointmapper注册它们的位置。远端客户连接到计算机时,它们查找end-pointmapper找到服务的位置。hacker扫描计算机的这个端口是为了找到这个计算机上运行exchangeserver吗?什么版本?还有些dos攻击直接针对这个端口。

端口:137、138、139

服务:netbiosnameservice

说明:其中137、138是udp端口,当通过网上邻居传输文件时用这个端口。而139端口:通过这个端口进入的连接试图获得netbios/smb服务。这个协议被用于windows文件和打印机共享和samba。还有winsregisrtation也用它。

端口:143

服务:interimmailaccessprotocolv2

说明:和pop3的安全问题一样,许多imap服务器存在有缓冲区溢出漏洞。记住:一种linux蠕虫(admv0rm)会通过这个端口繁殖,因此许多这个端口的扫描来自不知情的已经被感染的用户。当redhat在他们的linux发布版本中默认允许imap后,这些漏洞变的很流行。这一端口还被用于imap2,但并不流行。

端口:161

服务:snmp

说明:snmp允许远程管理设备。所有配置和运行信息的储存在数据库中,通过snmp可获得这些信息。许多管理员的错误配置将被暴露在internet。cackers将试图使用默认的密码public、private访问系统。他们可能会试验所有可能的组合。snmp包可能会被错误的指向用户的网络。

端口:177

服务:xdisplaymanagercontrolprotocol

说明:许多入侵者通过它访问x-windows操作台,它同时需要打开6000端口。

端口:389

服务:ldap、ils

说明:轻型目录访问协议和netmeetinginternetlocatorserver共用这一端口。

端口:443

服务:https

说明:网页浏览端口,能提供加密和通过安全端口传输的另一种http。

端口:456

服务:null

说明:木马hackersparadise开放此端口。

端口:513

服务:login,remotelogin

说明:是从使用cablemodem或dsl登陆到子网中的unix计算机发出的广播。这些人为入侵者进入他们的系统提供了信息。

端口:544

服务:null

说明:kerberoskshell

端口:548

服务:macintosh,fileservices(afp/ip)

说明:macintosh,文件服务。

端口:553

服务:corbaiiop(udp)

说明:使用cablemodem、dsl或vlan将会看到这个端口的广播。corba是一种面向对象的rpc系统。入侵者可以利用这些信息进入系统。

端口:555

服务:dsf

说明:木马phase10、stealthspy、inikiller开放此端口。

端口:568

服务:membershipdpa

说明:成员资格dpa。

端口:569

服务:membershipmsn

说明:成员资格msn。

端口:635

服务:mountd

说明:linux的mountdbug。这是扫描的一个流行bug。大多数对这个端口的扫描是基于udp的,但是基于tcp的mountd有所增加(mountd同时运行于两个端口)。记住mountd可运行于任何端口(到底是哪个端口,需要在端口111做portmap查询),只是linux默认端口是635,就像nfs通常运行于2049端口。

端口:636

服务:ldap

说明:ssl(securesocketslayer)

端口:666

服务:doomidsoftware

说明:木马attackftp、satanzbackdoor开放此端口

端口:993

服务:imap

说明:ssl(securesocketslayer)

端口:1001、1011

服务:null

说明:木马silencer、webex开放1001端口。木马dolytrojan开放1011端口。

端口:1024

服务:reserved

说明:它是动态端口的开始,许多程序并不在乎用哪个端口连接网络,它们请求系统为它们分配下一个闲置端口。基于这一点分配从端口1024开始。这就是说第一个向系统发出请求的会分配到1024端口。你可以重启机器,打开telnet,再打开一个窗口运行natstat-a将会看到telnet被分配1024端口。还有sqlsession也用此端口和5000端口。

端口:1025、1033

服务:1025:networkblackjack1033:null

说明:木马netspy开放这2个端口。

端口:1080

服务:socks

说明:这一协议以通道方式穿过防火墙,允许防火墙后面的人通过一个ip地址访问internet。理论上它应该只允许内部的通信向外到达internet。但是由于错误的配置,它会允许位于防火墙外部的攻击穿过防火墙。wingate常会发生这种错误,在加入irc聊天室时常会看到这种情况。

端口:1170

服务:null

说明:木马streamingaudiotrojan、psyberstreamserver、voice开放此端口。

端口:1234、1243、6711、6776

服务:null

说明:木马subseven20、ultorstrojan开放1234、6776端口。木马subseven10/19开放1243、6711、6776端口。

端口:1245

服务:null

说明:木马vodoo开放此端口。

端口:1433

服务:sql

说明:microsoft的sql服务开放的端口。

端口:1492

服务:stone-design-1

说明:木马ftp99cmp开放此端口。

端口:1500

服务:rpcclientfixedportsessionqueries

说明:rpc客户固定端口会话查询

端口:1503

服务:netmeetingt120

说明:netmeetingt120

端口:1524

服务:ingress

说明:许多攻击脚本将安装一个后门shell于这个端口,尤其是针对sun系统中sendmail和rpc服务漏洞的脚本。如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因。可以试试telnet到用户的计算机上的这个端口,看看它是否会给你一个shell。连接到600/pcserver也存在这个问题。

端口:1600

服务:issd

说明:木马shivka-burka开放此端口。

端口:1720

服务:netmeeting

说明:netmeetingh233callsetup。

端口:1731

服务:netmeetingaudiocallcontrol

说明:netmeeting音频调用控制。

端口:1807

服务:null

说明:木马spysender开放此端口。

端口:1981

服务:null

说明:木马shockrave开放此端口。

端口:1999

服务:ciscoidentificationport

说明:木马backdoor开放此端口。

端口:2000

服务:null

说明:木马girlfriend13、millenium10开放此端口。

端口:2001

服务:null

说明:木马millenium10、trojancow开放此端口。

端口:2023

服务:xinuexpansion4

说明:木马passripper开放此端口。

端口:2049

服务:nfs

说明:nfs程序常运行于这个端口。通常需要访问portmapper查询这个服务运行于哪个端口。

端口:2115

服务:null

说明:木马bugs开放此端口。

端口:2140、3150

服务:null

说明:木马deepthroat10/30开放此端口。

端口:2500

服务:rpcclientusingafixedportsessionreplication

说明:应用固定端口会话复制的rpc客户

端口:2583

服务:null

说明:木马wincrash20开放此端口。

端口:2801

服务:null

说明:木马phineasphucker开放此端口。

端口:3024、4092

服务:null

说明:木马wincrash开放此端口。

端口:3128

服务:squid

说明:这是squidhttp代理服务器的默认端口。攻击者扫描这个端口是为了搜寻一个代理服务器而匿名访问internet。也会看到搜索其他代理服务器的端口8000、8001、8080、8888。扫描这个端口的另一个原因是用户正在进入聊天室。其他用户也会检验这个端口以确定用户的机器是否支持代理。

端口:3129

服务:null

说明:木马masterparadise开放此端口。

端口:3150

服务:null

说明:木马theinvasor开放此端口。

端口:3210、4321

服务:null

说明:木马schoolbus开放此端口

端口:3333

服务:dec-notes

说明:木马prosiak开放此端口

端口:3389

服务:超级终端

说明:windows2000终端开放此端口。

端口:3700

服务:null

说明:木马portalofdoom开放此端口

端口:3996、4060

服务:null

说明:木马remoteanything开放此端口

端口:4000

服务:qq客户端

说明:腾讯qq客户端开放此端口。

端口:8000

服务:oicq

说明:腾讯qq服务器端开放此端口。

端口:80

Java调用WebService可以直接使用Apache提供的axisjar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。

1、编写代码方式:

package comyuduntest;

import javarmiRemoteException;

import orgapacheaxisclientCall;

import orgapacheaxisclientService;

import orgapacheaxismessagePrefixedQName;

import orgapacheaxismessageSOAPHeaderElement;

import comcezannegoldenuserException;

import comcezannegoldenuserUserManagerServiceProxy;

import javaxxmlnamespaceQName;

import javanetMalformedURLException;

import javaxxmlrpcServiceException;

import javaxxmlsoapName;

import javaxxmlsoapSOAPException;

public class testWebService {

public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException

  {

     //标识Web Service的具体路径

   String endpoint = "WebService服务地址";

     // 创建 Service实例

    Service service = new Service();   

     // 通过Service实例创建Call的实例

    Call call = (Call) servicecreateCall();

    //将Web Service的服务路径加入到call实例之中

    callsetTargetEndpointAddress( new javanetURL(endpoint) );//为Call设置服务的位置

   // 由于需要认证,故需要设置调用的SOAP头信息。   

    Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") ); 

          orgapacheaxismessageSOAPHeaderElement header = new SOAPHeaderElement(headerName); 

          headeraddTextNode( "blablabla" ); 

          calladdHeader(header);

          

//    SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("发布的wsdl里的targetNamespace里的url", "SoapHeader");   

//    soapHeaderElementsetNamespaceURI("发布的wsdl里的targetNamespace里的url");   

//    try  

//    {   

//        soapHeaderElementaddChildElement("string_itemName")setValue("blablabla");   

//    }   

//    catch (SOAPException e)   

//    {   

//        eprintStackTrace();   

//    }   

//    calladdHeader(soapHeaderElement);  

    //调用Web Service的方法

          orgapacheaxisdescriptionOperationDesc oper;

          orgapacheaxisdescriptionParameterDesc param;

          oper = new orgapacheaxisdescriptionOperationDesc();

          opersetName("opName");

          param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg0"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(", "string"), javalangStringclass, false, false);

          paramsetOmittable(true);

          operaddParameter(param);

          param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg1"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(", "string"), javalangStringclass, false, false);

          paramsetOmittable(true);

          operaddParameter(param);

          param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg2"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(", "string"), javalangStringclass, false, false);

          paramsetOmittable(true);

          operaddParameter(param);

          opersetReturnType(new javaxxmlnamespaceQName(", "string"));

          opersetReturnClass(javalangStringclass);

          opersetReturnQName(new javaxxmlnamespaceQName("", "return"));

          opersetStyle(orgapacheaxisconstantsStyleWRAPPED);

          opersetUse(orgapacheaxisconstantsUseLITERAL);

          operaddFault(new orgapacheaxisdescriptionFaultDesc(

                        new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "Exception"),

                        "Exception",

                        new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "Exception"), 

                        true

                       ));

   callsetOperation( oper );

   callsetOperationName(new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "opName"));

    //调用Web Service,传入参数

   String res = ( String ) callinvoke( new Object[]("arg0","arg1"));

   Systemoutprintln("===============");

   return res;

  }

/

   @param args

  /

 public static void main(String[] args) {

  try {

   Systemoutprintln(getResult());

  } catch (MalformedURLException e) {

   eprintStackTrace();

  } catch (RemoteException e) {

   eprintStackTrace();

  } catch (ServiceException e) {

   eprintStackTrace();

  } catch (SOAPException e) {

   eprintStackTrace();

  }

    }

}

2、利用Eclipse自动生成WebService client代码就容易多了:

首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish

这样,WebService Client代码已经生成好了。

接下来写一个Test类,在main函数中输入如下代码:

String endpoint = "服务器的WebService的地址";

 YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);

 try {

 String resultStr = umspopMethod("arg0","arg1");

 Systemoutprintln(resultStr);

 } catch (Exception e) {

 Systemoutprintln("异常");

 eprintStackTrace();

} catch (RemoteException e) {

 Systemoutprintln("RemoteException异常");

 eprintStackTrace();

}

一、NCSA Server

二、CERN httpd

三、Netscape Server

四、IIS

一、设置NCSA Server或Apache Server以使用CGI

NCSA Server的CGI11只允许用下列两种方式激活用户服务器上的脚本:ScriptAlias指令和AddType指令。这两条指令都放在srmconf文件中,该文件一般在用户的服务器根目录的conf目录中。

ScriptAlias指令告诉服务器该目录中的所有文件都是脚本或者是服务器作为CGI文件执行的程序。该方法能保证用户的CGI程序在特定位置。AddType指令允许用户告诉服务器任何具有指定前缀的文件都是可执行文件。如果希望将CGI程序放在服务器中任何地方的话该指令即很有用。

1、ScriptAlias指令

ScriptAlias指令位于Server Resource Map文件(srmconf)中,程序内容例如下:

DocumentRoot /usr/local/etc/httpd/htdocs

UserDir public_html

REdirect /HTTPD/ http://wwwservercom/

Alias /icons/ /usr/local/etc/httpd/icons/

ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/

DirectoryIndex indexhtml indexshtml indexcgi

IndexOptions FancyIndexing

AddIcon /icons/moviegif mpg qt

AddIcon /icons/menugif

AddIcon /icons/blankxbm

DefaultIcon /icons/unknownxbm

IndexIgnore / ~ # /HEADER /README

DefaultType text/plain

AccessFileName htaccess

srmconf文件允许用户根据自己系统需要设置HTTP Server。它允许用户告诉服务器用户的主页在什么地方,目录中的哪个文档是索引文档,如果不存在索引文件的话将装载什么文件以显示文件的类型,等等。srmconf及其他配置文件的说明可查阅http://wwwneasenet/tppmsgs/msgs0htm#34。

2、AddType指令

AddType指令是执行CGI程序的另一种方式,它是在srmconf文件中加入下列行:

AddType application/x-httpd-cgicgi

在自己的系统中设置了该指令后,任何在服务器控制范围内的扩展名为cgi的文件都会被作为CGI程序执行而不是作为文本文件阅读。这意味着用户可以在他的个人目录中创建脚本并能执行它。但是如果脚本写得不正确,就可能导致对文件系统、口令文件等的不同类型伤害。

AddType指令可以扩展为允许扩展名不是cgi的程序同样被执行。大家经常会看见以pl(Perl脚本的常见扩展名)或sh(Bourne Shell脚本的常见扩展名)结尾的脚本。如果想支持其他扩展名的程序,只需简单地将它们加入AddType指令中,如下所示:

AddType application/x-httpd-cgi cgi pl sh

3、访问配置文件

为了支持CGI程序的执行必须多加入一条指令。在Server Root/conf目录中是一个名为accessconf的配置文件。该文件允许用户设置ServerRoot下的哪个目录能够访问的全局限制,甚至允许用户控制哪些站点可以访问这些目录。下面是accessconf文件的一个例子:

<Directory /usr/local/etc/httpd/cgi-bin>

Options INdexes Exec CGI

</Directory>

<Directory /usr/local/etc/httpd/htdocs>

Options Indexes FollowSymLinks

AllowOverride All

<Limit GET>

order allow,deny

allow from all

</Limit>

</Directory>

Exec CGI表示允许执行该目录中的CGI脚本。Options Indexes FollowSymLinks表示允许索引(显示某文件夹中的内容)并能够遵循符号链(这就意味着在ServerRoot之外的文件也能被访问)。AllowOverride指令允许用户决定哪个指令可以被目录的htaccess文件覆盖。中设置了对该目录中允许使用GET方式的限制。在HTTPD中,部分指令的选项是GET、POST和PUT(目前PUT尚未实现)。order allow,deny一行告诉服务器先找allow行再找deny行。下一行则是告诉服务器允许所有站点访问该目录中的页面。

二、设置CERN HTTP服务器以使用CGI

CERN HTTP服务器(也称为W3C HTTP服务器)仅需要编辑/etc/httpdconf文件即可支持在服务器内使用CGI程序。这个指令类似于NCSA Server使用的指令:

Exec /url-prefix/ /physical-path/

其中/url-prefix/定义了客户能看见的路径,而/physical-path/则是包含脚本的目录的实际路径。

三、设置Netscape以使用CGI

首先要启动管理服务器。以root身份登录,并运行/ServerRoot/admserv/start-admin,缺省端口为81。然后启动浏览器连接。在Netscape Admin页面中,单击Select URL Mapping,从弹出窗口中选择Map a URL to a Local Directory。然后单击Select CGI and Server Parsed HTML,从弹出窗口中选择Activate CGI as a File Type。现在即可单击Browse Files并选择欲激活的目录。选择完目录后,单击I'd Like to Activate CGI as a File Type。在ServerRoot中即会看到Conf目录中的objconf配置文件中已加入了下列行:

NameTrans form="/cgi-bin" fn="pfx2dir" dir="/usr/local/web/cgi-bin" name="cgi"

name=cgi调用了下列行:

<Object name="cgi">

ObjectType fn="force-type" type="magnus-internal/cgi"

Service fn="send-cgi"

</Object>

它告诉服务器此为一个CGI目录,其中的所有文件都将用Netscape内部提供的CGI执行。 四、设置IIS以使用CGI

在IIS上运行CGI有十个简单的步骤:

1)安装Internet Service Manager。

2)从列表中选择WWW Servive。

3)选择Properties/Service Properties命令。

4)单击Directories标签。

5)单击Add按钮。

6)指定自己的cgi-bin目录的完整路径(例如,c:\webfiles\scripts)。

7)使用/scripts作为目录别名。

8)选中Execute检查框。

9)单击OK保存修改。

10)将自己的CGI程序放在c:\webfiles\scripts中并在HTML中作为/scripts/someprogramexe引用。

在使用IIS时经常出现的问题与设置IIS没太大关系而是和基本的操作系统功能有很大关系。IIS与底层的操作系统联系很紧密,即使已经设置为服务,Web服务器基本上是作为应用程序来运行的,通常只有一个用户安全环境,Web服务器能访问到的与Web服务器下的CGI程序能访问到的内容几乎没什么不同(这类似于UNIX环境,在UNIX环境下,很重要的一点就是不要将Web服务器作为root来运行)。IIS的工作很像一个扩展的文件系统。每个用户有自己的权限。CGI程序在执行该程序的访问者的用户安全环境中运行。对于未验证的页面,这就是缺省提供的“无名的”用户,而对验证的页面,安全环境就像用户位于服务器控制台前手工运行该程序一样。使大部分初学者犯错误的正是这种额外的安全层次。

IIS管理员最常抱怨的一个错误信息是"The Application misbehaved by not returning a complete set of headers"。错误消息接下来列出服务器接收到的头标--一般是个空的清单。这种讨厌的不明确的错误有一个直接的原因,不过这个原因与CGI脚本的错误操作没有一点关系。如果因为某种原因某个CGI脚本不能运行,它就不能产生任何头标。IIS将错误的责任推在脚本身上,实际上却几乎总是服务器管理员的错。CGI脚本需要访问系统DLLs、系统的临时目录以及它们使用的任何其他资源。如果该脚本是按静态约束进行编译的,那么除非所有组件均可用,否则操作系统不会装载该程序的。如果系统管理员锁紧了安全级使得脚本不能装载它的DLLs,那么脚本就不能运行。当脚本不能运行时,它也就不产生任何头标了(或者其他的输入),从而导致出现本段开头引用的错误消息。

如果管理员是在一个安全目录中运行脚本的(安全目录即是一个需要单独用户验证才能访问的目录),那么每个可能访问系统的用户都必须有下列安全权限。如果是无名地运行脚本,那么只有无名用户需要这些权限:

对%systemroot%system(一般为c:\winnt\system)的读权限

对%systemroot%system32(一般为c:\winnt\system32)的读权限

对临时目录(一般为c:\temp)的修改权限

对Web根的读权限

对CGI目录的修改权限

如果在有了这些访问权限之后仍然出问题,可以进一步临时给特殊的用户帐号Everyone赋予这些目录的修改权限。如果问题解决了,就可以认定是少了一个步骤(或一个用户)。纠正问题然后慢慢回收权限直至服务器重新安全。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何用c语言写cgi程序

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情