要求同一0.1s内把1个post的curl命令多并发5次/10次同一时间发出请求
脚本要求bash test.sh
请输入并发次数:例如5次就输入5
输入需要同时并发执行的curl命令: (以下命令只做举例非实际要执行的命令,要求可自定义。)
curl 'https://otheve.beacon.qq.com/analytics/v2_upload'-H 'Host: otheve.beacon.qq.com'-H 'Content-Type: jce'-H 'Connection: keep-alive'-H 'Accept: */*'-H 'User-Agent: com.sogou.sogouinput.BaseKeyboard/34674 CFNetwork/1237 Darwin/20.4.0'-H 'Content-Length: 469'-H 'Accept-Language: zh-cn'-H 'Accept-Encoding: gzip, deflate, br'
然后回车即可
要求同一时刻发出5次上述curl请求。
网上找的方法好多都不是同一时刻发出这个post,每个请求有0.5-1秒左右的时差无法满足要求。
最先给出的老板我会给个支付宝口令红包。
热议
推荐楼 mjj666zzz 昨天20:35
使用'&'+wait 实现“多线程”
推荐楼 liugogal 昨天20:32
直接 xargs –P 5 curl xxxx不行吗?
2楼 阿里云 昨天20:26
3楼 大吊 昨天20:27
白**大厂?
5楼 a8866051 昨天20:33
这是撸腾讯啥接口?
不是,只是随便拿一个举例子
7楼 teardrops 昨天20:37
bash + curl 就只能多进程吧..
8楼 zxxx 昨天20:39
curl --parallel --parallel-immediate --parallel-max 10
9楼 251768938 昨天20:39
10楼 a8866051 昨天20:41
使用'&'+wait 实现“多线程”
是多进程但是没法同时并发,这个只是执行完一个马上扔后台然后执行下一个
12楼 heibaihuali 昨天20:49
私聊我报价吧,用python给你写
python 不是伪多线程嘛
13楼 heibaihuali 昨天20:55
这种就用其它语言实现嘛,脚本语言不适合干这些,你延时需要0.1s,那就用cpp,先开几个线程等着,线程每10ms检查一次,有请求就立马发送不就完了,这样才能真正的保证延时
14楼 好鸭 昨天20:59
就是cc攻击嘛,github上很多的
15楼 sdqu 昨天21:01
for (int i=0;i<10;i++)pthread_create(xxxx)
16楼 Mr.lin 昨天21:11
python可以
gil锁并不影响并发
17楼 honus 昨天21:18
python 异步gather 应该是同时执行的
18楼 a8866051 昨天21:51
就是cc攻击嘛,github上很多的
不是拿来攻击,我需要也就5-20并发执行一次,不是几百
19楼 a8866051 昨天21:53
私聊我报价吧,用python给你写
大佬直接报个价吧,因为收益极小特多大的价钱我应该给不了
20楼 a8866051 昨天21:54
用管道呢,要不就换个性能高的机器
性能高的用这方法也没法5-10次执行在0.1s内发起全部执行命令,至少2,3秒
22楼 a8866051 昨天22:04
直接 xargs –P 5 curl xxxx不行吗?
执行直接没反应。。。
23楼 251768938 昨天22:05
大佬直接报个价吧,因为收益极小特多大的价钱我应该给不了
24楼 a8866051 昨天22:05
curl --parallel --parallel-immediate --parallel-max 10
测试请求无法同一时刻发出
25楼 zxxx 昨天22:06
测试请求无法同一时刻发出
要求10ms以内同时发出么?
26楼 jaymi 昨天22:09
https://github.com/jneeee/qos_tool
我写过一个python qos 脚本,并发可以很大。拿去改一改不是很难
27楼 a8866051 昨天22:42
要求10ms以内同时发出么?
越短越好,最好同一时刻
28楼 a8866051 昨天22:44
https://github.com/jneeee/qos_tool
我写过一个python qos 脚本,并发可以很大。拿去改一改不是很难 ...
主要是自己太菜了
29楼 解憂雜貨店 昨天22:57
PHP是最好的语言。
workerman版本:https://www.workerman.net/doc/workerman/components/workerman-http-client.html
swoole版本:0. https://wiki.swoole.com/#/coroutine/multi_call
1. https://wiki.swoole.com/#/coroutine/wait_group
30楼 解憂雜貨店 昨天23:02
PHP是最好的语言。
workerman版本:https://www.workerman.net/doc/workerman/components/workerman-http-c ...
cli应用,配和swoole-cli写一些shell脚本,贼爽贼方便
32楼 theoneman 4小时前
c语言 原生 tcp小程序 可以吧
需要把 --compressed去掉,url 的地址部分 前缀需要加个 -t (懒得写位置顺序)-c 后面紧跟的是并发量
- ./curl-pnrt -c 900 -t 'https://static.leetcode.cn/cn-mono-assets/production/main/runtime~main.8725179e.js' \
-H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"' \
-H 'Referer: https://leetcode.cn/' \
-H 'DNT: 1' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' \
-H 'sec-ch-ua-platform: "macOS"'
其他的几乎一样(除非就没写那个功能,哈哈~)
-c: 就是想要的并发数1000 0.3s 左右(可能是同一个地域的服务器,所以快些)
-t: 目标url
-X: 默认get , 比如:-X POST 就是post
-H: 和原版crul 一样
-d: get的格式和原版一样 key1=xxx,post 的话和原版一样,不过记得加个-H 'Content-Type: xxxx/xxx' 的类型
-p: 打印响应的信息
效果如下:
源码:
- package main
import (
"bytes"
"flag"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"strings"
"sync"
"time"
)
type httpClient struct {
client *http.Client
}
type stringsValue []string
func newStringsValue(val string, p *[]string) *stringsValue {
if val != "" {
*p = append(*p, val)
}
return (*stringsValue)(p)
}
func (s *stringsValue) Set(val string) error {
*s = append(*s, val)
return nil
}
func (s *stringsValue) Get() interface{} { return []string(*s) }
func (s *stringsValue) String() string { return fmt.Sprintln([]string(*s)) }
func main() {
ht := &httpClient{}
ht.client = &http.Client{
Transport: &http.Transport{
MaxIdleConns: 900,
MaxIdleConnsPerHost: 900,
IdleConnTimeout: time.Second * 30,
},
}
now := time.Now()
httpUrl := ""
headers := &[]string{}
flag.StringVar(&httpUrl, "t", "", "Please enter the correct URL: http/https")
count := flag.Int("c", 1, "Number of concurrent runs: Default is 1")
flag.Var(newStringsValue("", headers), "H", "Example Imitate the curl command -h")
protocol := flag.String("X", "GET", "-XPOST|GET")
data := flag.String("d", "", "supportJSON")
var isPrintResp bool
flag.BoolVar(&isPrintResp, "p", false, "Whether to output RESP")
//userAgent := flag.String("A", "", "User-Agent")
flag.Parse()
if httpUrl == "" {
fmt.Println("Please enter the correct URL")
}
headerMap := map[string]string{}
for _, s := range *headers {
split := strings.Split(s, ": ")
if len(split) == 2 {
headerMap[split[0]] = split[1] } else {
fmt.Println("header fail")
return
}
}
//fmt.Println(*headers)
waitGroup := sync.WaitGroup{}
*protocol = strings.ToUpper(*protocol)
//time.Sleep(3 * time.Second)
for i := 0; i < *count; i++ {
fmt.Printf("")
go func() {
waitGroup.Add(1)
if *protocol == "GET" {
values := url.Values{}
if data != nil && *data != "*" {
for _, s := range strings.Split(*data, "&") {
split := strings.Split(s, "=")
if len(split) == 2 {
values.Set(split[0], split[1])
}
}
}
if resp, err := ht.GET(httpUrl, values); err != nil {
if err == io.EOF {
if isPrintResp {
fmt.Println(string(resp))
}
}
fmt.Println(err)
} else {
if isPrintResp {
fmt.Println(string(resp))
}
}
} else if *protocol == "POST" {
if resp, err := ht.POST(httpUrl, []byte(*data), headerMap); err != nil {
if err == io.EOF {
if isPrintResp {
fmt.Println(string(resp))
}
}
fmt.Println(err)
} else {
if isPrintResp {
fmt.Println(string(resp))
}
}
}
waitGroup.Done()
}()
}
waitGroup.Wait()
fmt.Println()
fmt.Printf("time spent: %v s", time.Since(now).Seconds())
fmt.Println()
}
func (ht *httpClient) GET(httpUrl string, queryStr url.Values) (res []byte, err error) {
var Url *url.URL
Url, err = url.Parse(httpUrl)
if err != nil {
fmt.Printf("parse fail:%v", err)
return nil, err
}
Url.RawQuery = queryStr.Encode()
resp, err := ht.client.Get(Url.String())
if err != nil {
fmt.Println("err:", err)
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
func (ht *httpClient) POST(httpUrl string, jsonByte []byte, headerMap map[string]string) (res []byte, err error) {
var Url *url.URL
Url, err = url.Parse(httpUrl)
if err != nil {
fmt.Printf("parse fail:%v", err)
return nil, err
}
request, err := http.NewRequest("POST", Url.String(), bytes.NewBuffer(jsonByte))
if err != nil {
fmt.Println("err:", err)
return nil, err
}
for k, v := range headerMap {
request.Header.Set(k, v)
}
//request.Header.Set("Content-Type", "application/json")
resp, err := ht.client.Do(request)
if err != nil {
fmt.Println("err:", err)
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
34楼 zhongziso 6分钟前
这是啥接口?
申明:本文内容由网友收集分享,仅供学习参考使用。如文中内容侵犯到您的利益,请在文章下方留言,本站会第一时间进行处理。
