C语言用socket怎么发送post请求,携带数据

zzzrrr1989 2015-01-27 01:59:54
如题,C语言写的客户端向服务器发送数据,求相关格式:
snprintf(request, sizeof(request) - 1,
"POST %s%sgw_id=%s&sys_uptime=%lu&sys_memfree=%u&sys_load=%.2f&wifidog_uptime=%lu&ap_mac=%s HTTP/1.0\r\n"
"User-Agent: WiFiDog %s\r\n"
"Host: %s\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: 200\r\n"
"\r\n"
"mac=%s&token=%s",
auth_server->authserv_path,
auth_server->authserv_ping_script_path_fragment,
config_get_config()->gw_id,
sys_uptime,
sys_memfree,
sys_load,
(long unsigned int)((long unsigned int)time(NULL) - (long unsigned int)started_time),
brlan_mac,
VERSION,
auth_server->authserv_hostname,
first->mac,
first->token);
send(sockfd, request, strlen(request), 0);

其中first->mac,first->token就是要发送的数据。
这么写有问题么?
...全文
1129 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 mxway 的回复:
[quote=引用 1 楼 zzzrrr1989 的回复:] "Content-Type: application/x-www-form-urlencoded\r\n"如果这句最后的\r\n改成/r/n
\r\n不能改成/r/n的,\r\n是rfc的标准。你问题主要在"Content-Length: 200\r\n",你确定 "Content-Length: 200\r\n" "\r\n" 之后发送的数据是200字节。如果不是,那服务器当然就会出现想不到的问题了。 [/quote] ------------------------------------------------------------------- 可以了,3Q
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
引用 12 楼 luciferisnotsatan 的回复:
实际使用的话,还是用wininet,libcurl这些库吧。 自己写,可以看下RFC 2616协议,了解HTTP的格式是怎么样的
--------------------------------------------------------------------------------------- 感谢回复,我有空了解下。 因为这里是在改别人的代码,以前是用的get,但是现在要带不少数据到服务器,用get就不合适了,改成post。socket那套东西都是原来的,懒得重写。
luciferisnotsatan 2015-01-27
  • 打赏
  • 举报
回复
实际使用的话,还是用wininet,libcurl这些库吧。 自己写,可以看下RFC 2616协议,了解HTTP的格式是怎么样的
mxway 2015-01-27
  • 打赏
  • 举报
回复
引用 10 楼 zzzrrr1989 的回复:
恩,我试下~~顺便问下,"Content-Type: application/x-www-form-urlencoded\r\n"这句可以不写么?
这个不太清楚,可以先带上,测试成功后再去掉试下。如果不明白那就看rfc2616文档,这个最权威。
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
引用 9 楼 mxway 的回复:
[quote=引用 8 楼 zzzrrr1989 的回复:] [quote=引用 7 楼 mxway 的回复:] 是的。比如你发送的实际字节是100,但Content-Length是200,这时服务器程序接收到你的100字节后,会认为你发送的数据还没发完,有可能会一直等你下面100个字节。
------------------------------------------------------------------------------------ 比如,我要发送 mac=cc:34:29:14:13:ce&token=0a96828bf42fafc714495360b8848ad11d663280 就应该设置成 strlen(xxx) ?[/quote] 是的。我不清楚你发的那个别人写的例子有没有测试过,还有就是那个程序请求的服务器程序是怎么处理的。[/quote] -------------------------------------------------------------------------------------- 恩,我试下~~顺便问下,"Content-Type: application/x-www-form-urlencoded\r\n"这句可以不写么?
mxway 2015-01-27
  • 打赏
  • 举报
回复
引用 8 楼 zzzrrr1989 的回复:
[quote=引用 7 楼 mxway 的回复:] 是的。比如你发送的实际字节是100,但Content-Length是200,这时服务器程序接收到你的100字节后,会认为你发送的数据还没发完,有可能会一直等你下面100个字节。
------------------------------------------------------------------------------------ 比如,我要发送 mac=cc:34:29:14:13:ce&token=0a96828bf42fafc714495360b8848ad11d663280 就应该设置成 strlen(xxx) ?[/quote] 是的。我不清楚你发的那个别人写的例子有没有测试过,还有就是那个程序请求的服务器程序是怎么处理的。
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
引用 7 楼 mxway 的回复:
是的。比如你发送的实际字节是100,但Content-Length是200,这时服务器程序接收到你的100字节后,会认为你发送的数据还没发完,有可能会一直等你下面100个字节。
------------------------------------------------------------------------------------ 比如,我要发送 mac=cc:34:29:14:13:ce&token=0a96828bf42fafc714495360b8848ad11d663280 就应该设置成 strlen(xxx) ?
mxway 2015-01-27
  • 打赏
  • 举报
回复
是的。比如你发送的实际字节是100,但Content-Length是200,这时服务器程序接收到你的100字节后,会认为你发送的数据还没发完,有可能会一直等你下面100个字节。
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
引用 5 楼 zzzrrr1989 的回复:
------------------------------------------------------ 这里的length是375,但是下面明显不是375~~还是说图中的代码也是错的?
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 mxway 的回复:
[quote=引用 1 楼 zzzrrr1989 的回复:] "Content-Type: application/x-www-form-urlencoded\r\n"如果这句最后的\r\n改成/r/n
\r\n不能改成/r/n的,\r\n是rfc的标准。你问题主要在"Content-Length: 200\r\n",你确定 "Content-Length: 200\r\n" "\r\n" 之后发送的数据是200字节。如果不是,那服务器当然就会出现想不到的问题了。 [/quote] ----------------------------------------------------------------------------------------- 字节数必须要跟实际发送的一样多么? 我看别人写的:
zuxi 2015-01-27
  • 打赏
  • 举报
回复
Content-Length: 200 这里的200是POST的BODY有多少字节,你要计算mac=%s&token=%s有几个字节,再设置到Content-Length头. ps:你用能发HTTP的工具给你服务器发一个POST包,(用Fiddler就可以),看你服务器能不能收到,再用C语言发一个一样的POST请求包过去就可以了。
mxway 2015-01-27
  • 打赏
  • 举报
回复
引用 1 楼 zzzrrr1989 的回复:
"Content-Type: application/x-www-form-urlencoded\r\n"如果这句最后的\r\n改成/r/n
\r\n不能改成/r/n的,\r\n是rfc的标准。你问题主要在"Content-Length: 200\r\n",你确定 "Content-Length: 200\r\n" "\r\n" 之后发送的数据是200字节。如果不是,那服务器当然就会出现想不到的问题了。
zzzrrr1989 2015-01-27
  • 打赏
  • 举报
回复
求高手帮忙看下啊~~ "Content-Type: application/x-www-form-urlencoded\r\n"如果这句最后的\r\n改成/r/n,则这个post,服务器还是能收到的,但是后面的mac跟token的值获取不到,而不这么改的话,服务器竟然都收不到这个post请求,不知道啥原因~~~

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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