如何用C语言开发一个通用web服务器?

如何用C语言开发一个通用web服务器?,第1张

用C语言开发WEB,可以用C++BUILDER6,称ISAPI,一般人可能做不起来,有点麻烦;

唯一是速度很快,别人看不到源码,掌握了编程套路,也可以开发应用;

缺点:

1。不是解释性语言,做的WEB调试非常麻烦;现在做WEB开发的,用C#、JAVA较多;都是解释性的语言;

2。因为是.DLL的二进制代码,一般商业网站不给予运行的环境,因为网站服务器会被你可能搞瘫,安全性得不到保障;所以,你得自备网页服务器;

3。得不到技术支持,因为没几个人会这种开发;

package com.yudun.test

import java.rmi.RemoteException

import org.apache.axis.client.Call

import org.apache.axis.client.Service

import org.apache.axis.message.PrefixedQName

import org.apache.axis.message.SOAPHeaderElement

import com.cezanne.golden.user.Exception

import com.cezanne.golden.user.UserManagerServiceProxy

import javax.xml.namespace.QName

import java.net.MalformedURLException

import javax.xml.rpc.ServiceException

import javax.xml.soap.Name

import javax.xml.soap.SOAPException

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) service.createCall()

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

call.setTargetEndpointAddress( new java.net.URL(endpoint) )//为Call设置服务的位置

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

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

org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName)

header.addTextNode( "blablabla" )

call.addHeader(header)

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

//soapHeaderElement.setNamespaceURI("发布的wsdl里的targetNamespace里的url")

//try

//{

//soapHeaderElement.addChildElement("string_itemName").setValue("blablabla")

//}

//catch (SOAPException e)

//{

//e.printStackTrace()

//}

//call.addHeader(soapHeaderElement)

//调用Web Service的方法

org.apache.axis.description.OperationDesc oper

org.apache.axis.description.ParameterDesc param

oper = new org.apache.axis.description.OperationDesc()

oper.setName("opName")

param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(", "string"), java.lang.String.class, false, false)

param.setOmittable(true)

oper.addParameter(param)

param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(", "string"), java.lang.String.class, false, false)

param.setOmittable(true)

oper.addParameter(param)

param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(", "string"), java.lang.String.class, false, false)

param.setOmittable(true)

oper.addParameter(param)

oper.setReturnType(new javax.xml.namespace.QName(", "string"))

oper.setReturnClass(java.lang.String.class)

oper.setReturnQName(new javax.xml.namespace.QName("", "return"))

oper.setStyle(org.apache.axis.constants.Style.WRAPPED)

oper.setUse(org.apache.axis.constants.Use.LITERAL)

oper.addFault(new org.apache.axis.description.FaultDesc(

new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),

"Exception",

new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),

true

))

call.setOperation( oper )

call.setOperationName(new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "opName"))

//调用Web Service,传入参数

String res = ( String ) call.invoke( new Object[]("arg0","arg1"))

System.out.println("===============")

return res

}

/**

* @param args

*/

public static void main(String[] args) {

try {

System.out.println(getResult())

} catch (MalformedURLException e) {

e.printStackTrace()

} catch (RemoteException e) {

e.printStackTrace()

} catch (ServiceException e) {

e.printStackTrace()

} catch (SOAPException e) {

e.printStackTrace()

}

}

}

已知url ,host, port

int s, size

struct sockaddr_in sin

struct hostent* phe

char cmd[256]

char msg_hdr[1000]

char* p

//准备http中GET 方法的请求。

sprintf(cmd,"GET %s\r\nHTTP/1.1\r\nHost:%s", url, host)

//创建socket

if((s=socket(PF_INET,SOCK_STREAM,0))<0)

return -1

//取得远程主机的IP地址,失败函数返回-1

if((phe = gethostbyname(host)) == NULL)

return -1

memset(&sin,0,sizeof(sin))

memcpy(&sin.sin_addr,phe->h_addr,sizeof(struct in_addr))

sin.sin_family=AF_INET

sin.sin_port=htons(pms->port)

//跟远程机器建立连接,失败函数返回-1

if(connect(s,(struct sockaddr*)&sin,sizeof(sin))==-1)

return -1

//发送GET请求

if(write(s,cmd,strlen(cmd))<0)

return 0

//从链接描述符(连接管道)中读取传送过来的数据

if(read(s, msg_hdr, 300)<0)

error

close(s)

//读到该文件的大小

if((p=strstr(msg_hdr,"Content-Length"))||(p=strstr(msg_hdr,"Content-length:")))

p+=16

else

error

//返回大小

size = atoi(p)

sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nConnection: close\r\nRange: bytes0-%d\r\n\r\n", url, host, size)

//创建套接口

if((s=socket(AF_INET,SOCK_STREAM,0))<0)

return 0

//取得远程主机的IP地址,失败返回0

if((phe = gethostbyname(host)) == NULL)

return 0

memset(&sin,0,sizeof(sin))

memcpy(&sin.sin_addr,phe->h_addr,sizeof(struct in_addr))

sin.sin_family=AF_INET

sin.sin_port=htons(port)

//建立连接

if(connect(s,(struct sockaddr*)&sin,sizeof(sin))==-1)

return 0

//发送读取请求

if(write(s,cmd,strlen(cmd))<0)

error

read(s, buf, BUFSIZE)..............


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/584009.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-06
下一篇2023-07-06

发表评论

登录后才能评论

评论列表(0条)

    保存