如何用c语言写cgi程序
包括标准输入、环境变量、标准输出三部分。
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赋予这些目录的修改权限。如果问题解决了,就可以认定是少了一个步骤(或一个用户)。纠正问题然后慢慢回收权限直至服务器重新安全。
0条评论