bcb 4.5下DOS程序实现HTTP POST请求问题

utnubu 2011-02-11 03:30:54
在BCB 4.5下编写DOS程序实现HTTP传送XML如何实现?只是简单的发送给一个URL,然后读回传值,请各位指导,贴点代码最好,谢谢
...全文
430 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
utnubu 2011-04-12
  • 打赏
  • 举报
回复
谢谢各位。
最后选择共享盘方式。
utnubu 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yuchongjike 的回复:]

你的网卡是什么型号的?直接去它的官网下载一个扩展名是.DOS的DOS驱动,然后去我的资源里面下那个加载驱动的程序就可以了(Packet)。需要修改里面的配置文件,说明里面有讲怎么修改。
驱动加载顺序:
device.com PROTMAN.DOS /i:驱动路径(最好写绝对的,我之前用相对的总是有问题)
device.com dis_pkt.dos
device.com 你的……
[/Quote]

按照你的设置提示安装成功,运行demo中自带的bootp和ping都没问题。
但是我把源码重新用bc 4.5,tubor c 2/3编译生成exe文件,然后运行失败。提示信息还是
Unable to initialize socket library

再请教一下各位。请问利用这个库实现的socket程序能不能给实现这种应用需求:
多台DOS客户机(大概60台左右)与单台服务器交互;
即多台dos客户端同时发送请求到一台服务器,然后服务器端多线程进行处理,完成后返回值到多台客户端。

因为目前利用共享目录的方案测试时发现实现不了这种需求,只能单台dos客户端与单台服务端交互
laowang2 2011-02-19
  • 打赏
  • 举报
回复
yuchongjike 2011-02-18
  • 打赏
  • 举报
回复
你的网卡是什么型号的?直接去它的官网下载一个扩展名是.DOS的DOS驱动,然后去我的资源里面下那个加载驱动的程序就可以了(Packet)。需要修改里面的配置文件,说明里面有讲怎么修改。
驱动加载顺序:
device.com PROTMAN.DOS /i:驱动路径(最好写绝对的,我之前用相对的总是有问题)
device.com dis_pkt.dos
device.com 你的网卡驱动.dos
netbind.com
或者你要有PXE环境的话,更简单点儿,直接undipd 0x60就可以了,然后执行你的SOCK程序测试。

要测试你的驱动是否有加载成功,执行demo里面的bootp,显示有MAC和IP,DNS等信息。

PS:我很少用QQ,一般用MSN......
  • 打赏
  • 举报
回复
看来你还需要找块老网卡。:)
utnubu 2011-02-15
  • 打赏
  • 举报
回复
我的网卡不是文档中的那些。
所以输入ne2000 0x62 5 0x320后显示的mac地址是FF:FF:FF:FF:FF:FF
这样应该是有问题的。

但是我奇怪的是在这个环境下直接运行demo中exe文件夹的自带exe文件是没问题的。
而我自己编译生成的exe文件却执行失败。

utnubu 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 delphiguy 的回复:]

我看了一下它的文档,它需要有Reltek 8019(NE2000兼容)、8139系列网卡,其他网卡可能有问题。
[/Quote]

下载了dscok库,以demo中的httpd为例。
执行demo中exe文件夹的httpd.exe文件,成功。执行结果为:
DSock Web Server Example
HTTP Server IP:192.168.0.103

但是直接打开工程.prj编译后生成exe。执行失败。执行结果为:
DSock Web Server Example
Unable to initialize socket library

新建了一个dos stardard,large模式的工程,把demo中httpd.c的代码拷贝过来,dsock.h,dsock.lib分别放在include和lib文件夹中。执行有6个警告(把模式large改成huge就没这些警告):
Call to function 'DSock_Open' with no prototype
...

生成的httpd.exe大小150多k,而demo中自带的httpd.exe大小40多k。
执行结果还是
DSock Web Server Example
Unable to initialize socket library

编译环境:bcb 4.5, turbo c++ 3.0

请问一下究竟是哪里出问题了??

补充:
驱动用ne2000
但是执行后mac地址是显示FF:FF:FF:FF:FF:FF,
  • 打赏
  • 举报
回复
我看了一下它的文档,它需要有Reltek 8019(NE2000兼容)、8139系列网卡,其他网卡可能有问题。
utnubu 2011-02-12
  • 打赏
  • 举报
回复
DSock_Open()是dsock.lib库文件中的函数
utnubu 2011-02-12
  • 打赏
  • 举报
回复
网卡驱动已经安装好了。ping得通。

然后测试了一下dsock061t.zip demo中的httpd例子,
我是用bcb 4.5新建一个工程,然后把源码拷过来测试的,
build没问题,但是执行没反应。
因为建的工程是dos standard模式下的,
所以又到纯dos环境下测试。
执行结果如下:
DSock Web Server Example
Unable to initialize socket library

相关源码:
DWORD dwIp;
char szBuf[32];
SOCKET s;
char *sz = "-\\|/";
uint nCnt = 0;

printf("\nDM&P DSock Web Server Example\n\n");

/* Open DSock library */
if(DSock_Open() == FALSE)
{
printf("Unable to initialize socket library\n");
return 1;
}

请问一下是不是dsock.lib库文件放错位置了还是其他问题呢?
谢谢
  • 打赏
  • 举报
回复
DOS下使用TCP通讯比较复杂。

首先你得安装网卡驱动,这是硬件相关的,不同的网卡驱动通常不能互用。另外,这网卡驱动一般只支持到数据链路层协议(他们叫Packet Driver),你还得再安装一个TCP/IP驱动,否则你只能自己实现TCP/IP协议栈了,那实在复杂,应用层的HTTP相对就比较简单了。

DOS下的TCP/IP驱动,一般用ERTOS或者Trumpet(http://www.pld.ttu.ee/~priidu/library/net/trumpet.html)。

DOS下HTTP的支持,我知道的有一个DSock库:ftp://download@ftp.dmp.com.tw/dmp-lib/dsock/dsock061t.zip。

utnubu 2011-02-11
  • 打赏
  • 举报
回复
1 #include<stdio.h>
2 #include<string.h>
3 #include<sys/socket.h>
4 #include<stdlib.h>
5 #include<netinet/in.h>
6
7 // post a big file
8 #define Req "POST /upload.php HTTP/1.0\r\n" \
9 "Accept:image/gif, image/x-xbitmap, image/jpeg, image/pjepg, application/vnd.ms-excel, application/msword, applicationvnd.ms-powerpoint, */*\r\n" \
10 "Accept-Language:en-us\r\n" \
11 "Accept-Encoding:gzip, deflate\r\n" \
12 "User-Agent:Mozilla/4.0\r\n" \
13 "Host:192.168.1.180\r\n" \
14 "Content-Type:application/x-www-urlencoded\r\n" \
15 "-----------------------------7d91a515b05a2\r\n" \
16 "Content-Disposition:form-data;name=\"upload_file\";filename=\"tmp.gz\"\r\n" \
17 "Content-Type:application/x-gzip\r\n"
18
19
20 #define DST_IP "192.168.1.180"
21 #define ReqLen sizeof(Req)
22
23 int main()
24 {
25 struct sockaddr_in srv;
26 int sock, nbytes;
27 char sndbuf[1024] = {0};
28 char recbuf[1024] = {0};
29
30 if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
31 {
32 fprintf(stderr, "socket() error!\n");
33 exit(1);
34 }
35
36 srv.sin_family = AF_INET;
37 srv.sin_addr.s_addr = inet_addr(DST_IP);
38 srv.sin_port = htons(80);
39
40 if((connect(sock, (struct sockaddr *)&srv, sizeof(struct sockaddr))) == -1)
41 {
42 printf("connect() error!\n");
43 exit(1);
44 }
45
46
47 strncpy(sndbuf, Req, ReqLen);
48 if(write(sock, sndbuf, ReqLen) == -1)
49 {
50 fprintf(stderr, "write() error!\n");
51 exit(1);
52 }
53
54 // get response
55 int bytes;
56 while(1)
57 {
58 nbytes = read(sock, recbuf, 1023);
59 if(nbytes < 0)
60 break;
61 recbuf[nbytes] = '\0';
62 printf(recbuf);
63 }
64
65 close(sock);
66
67 return 0;
68 }


我在网上搜到这段代码。但是编译出错
因为之前都没有接触这一块,所以很多都不懂,只能摸着石头过河了。

目前的需求就是要求在纯dos环境下,客户端发送一段信息附加在url中到服务器端,然后读取服务器端的回传值。
谢谢

utnubu 2011-02-11
  • 打赏
  • 举报
回复
能否贴两句代码?我只是传个URL到服务器端,然后读回传值
Maconel 2011-02-11
  • 打赏
  • 举报
回复
# 建立tcp连接。
# 将你的数据组字符串形式的xml。
# 封为http协议,看你协议的具体格式了,估计前边加个http头就可以了,最终得到字符串形式的数据。
# 通过tcp发送出去。
# 得到响应。
# 解析响应中的数据。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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