- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
> /tmp/urls.tx-6ren">
比如说,我有一个 url 列表:
$ for i in `seq 1 90`; do echo "$RANDOM$RANDOM.blogspot.com" ; done >> /tmp/urls.txt
我在 C 中的 GET 比使用我的 go 代码时花费的时间长得多。
这是 C 代码:
n_memory.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(ptr == NULL) {
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
int try_url(char *url);
int main(int argc, char **argv){
if (argc < 2){
fprintf(stderr, "error, argc\n");
return 1;
}
FILE *fp = fopen(argv[1],"r");
if (!fp){
fprintf(stderr, "fopen, argc\n");
return 1;
}
int count = 1;
char _line[2048];
char url[8192];
while ( fgets(_line, 1024, fp) ){
_line[strcspn(_line, "\r\n")] = 0;
char *part1 = "https://dns.google.com/resolve?name=";
char *part3 = "&type=A";
snprintf(url, 4096, "%s%s%s", part1, _line, part3);
printf("%d %s\n", count, url);
try_url(url);
if (count > 80){
break;
}
count++;
}
//try_url(argv[1]);
puts("Done");
return 0;
}
int try_url(char *url)
{
CURL *hnd;
CURLcode res;
struct curl_slist *slist1;
struct MemoryStruct chunk;
chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
chunk.size = 0; /* no data at this point */
curl_global_init(CURL_GLOBAL_ALL);
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
curl_easy_setopt(hnd, CURLOPT_RESOLVE, slist1);
slist1 = NULL;
slist1 = curl_slist_append(slist1, "dns.google.com:443:172.217.5.110");
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0);
curl_easy_setopt(hnd, CURLOPT_URL, url);
curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "libcurl-agent/1.0");
res = curl_easy_perform(hnd);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
else {
printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
}
curl_easy_cleanup(hnd);
free(chunk.memory);
curl_global_cleanup();
return 0;
}
这是执行代码:
n_get.go
package main
import (
"bufio"
"fmt"
"log"
"net/http"
"os"
"time"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Invalid usage")
os.Exit(1)
}
filename := os.Args[1]
f, err := os.Open(filename)
checkerr(err)
defer f.Close()
fscanner := bufio.NewScanner(f)
i := 1
for fscanner.Scan() {
text := fscanner.Text()
// https://dns.google.com/resolve?name=1.bp.blogspot.com&type=A
url := "https://dns.google.com/resolve?name=" + text + "&type=A"
//fmt.Println(i, url);
get_url(url)
if i == 80 {
break
}
i = i + 1
}
fmt.Println("Hello!")
}
func checkerr(err error) {
if err != nil {
fmt.Println(err)
log.Fatal(err)
}
}
func get_url(url string) int {
fmt.Println(url)
t1 := time.Now()
resp, err := http.Get(url)
t2 := time.Now()
checkerr(err)
fmt.Println(resp.Status)
diff := t2.Sub(t1)
fmt.Println(url, "Took us", diff)
if resp.StatusCode == 200 {
fmt.Println("OK")
return 0
} else {
fmt.Println("Failed")
return 1
}
}
我什至试图通过 --resolve 选项来帮助 libcurl 传递它可以使用的 IP 地址,从而使它不必进行名称查找。然而,这似乎没有多大帮助。
甚至尝试使用 curl 的 --insecure
选项,仍然没有太大影响。
这是执行 80 个 HTTPS GET 所花费的时间:
+------------------+-----------------+
| golang | c |
+------------------------------------+
| real 0m2.670s |real 0m20.024s|
| user 0m0.555s |user 0m13.393s|
| sys 0m0.086s |sys 0m0.242s |
+------------------------------------+
这有点不平衡,我正在寻找缩小差距的指示。我怎样才能提高我的 C 代码的速度?任何一点将不胜感激。
最佳答案
首先,不要每次尝试都运行所有 curl init。做一次。
我认为您也不需要每次都执行所有选项。
并且也不要执行 1 字节的 malloc。将其保留为 NULL。 Realloc 知道如何处理它。
关于c - https 使用 libcurl vs golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54836605/
发起 HTTPS 对话时,会生成一个随机数来为交换创建 key (或类似的东西)。我不明白这是如何防止重放攻击的。 为什么攻击者不能重复真实客户端发出的所有请求? This answer claims
要使这个简单的 HTTP header 与支持 HTTPS 的服务器通信,还需要进行哪些其他更改。 GET /index.php HTTP/1.1 Host: localhost [CR] [CR]
我想弄清楚 HTTPS 是有状态还是无状态?这是关于我构建的 RESTful API。我们最初使用 HTTP。由于 HTTP 本质上是在无状态的 TCP/IP 上工作的,因此 HTTP 是无状态的,但
我从各种来源了解到,HTTPS 握手是使用 HTTPS 中最重要的部分。我在服务器之间内部使用 POST 来传达信息,并希望为此使用 HTTPS。我想知道实际的 HTTPS 握手持续多长时间/“保持打
我想知道HTTPS是如何实现的。是数据加密还是路径加密(数据通过哪个路径)。如果有人向我提供实现细节,我将不胜感激。 最佳答案 很简单,HTTPS 使用安全套接字层来加密客户端和服务器之间传输的数据。
我是 HTTPS 技术的初学者:(。我对 HTTPS 的实现有一些疑问。 假设我有一张注册表 http://www.sitename.com/register.php 如果我想在 HTTPS 中使用它
在带有 Devise 1.51 的 Rails 3.1.1 应用程序中,我希望确认消息中使用的确认链接是 https 而不是 http。因此,在电子邮件中,“确认链接”会指向如下内容: https:/
我对 HTTPS 有疑问。我的一位前辈告诉我,Https 实际上并不使用 SSL/TLS,而只是使用它们的加密算法。他说,证书的握手过程是在传输层完成的,但实际有效负载的安全 key 加密是在应用层完
我建立了一个使用 PHP mail() 的网站。如果我在 http://上点击脚本,我可以让它成功运行,但如果我切换到 https://它就不起作用了!我使用 Godaddy 进行托管,并通过他们购买
我最近更改了域并设置了来自 https://sadlergatestoyou.co.uk 的重定向至https://www.sadlergates.co.uk但是,www.sadlergatestoy
我正在制作一个依赖于设置 http.proxyPort 和 http.proxyHost 的 Java 应用程序。有两个进程:一个是正则程序,一个是代理程序。我有一个在 http.proxyPort(
我正在开发一个 RESTful 应用程序,为此我需要将从 http 地址传入的请求重定向到它的 https 等效项。我似乎无法使用 ring/compojure 启用 https。 有人有一些有用的教
我看过很多关于重写的文章。都好。但没有一个涵盖这种具体情况。所以这是我的问题:希望你能帮忙。因为我无法让它发挥作用。 我们在domain.com(非www)上运行网站 我们已设置 ssl(因此仅限 h
我需要将大量请求自动提交到基于云的数据库接口(interface) (Intelex)。没有任何方法可以批量提交某些操作,但是提交单个请求所必需的只是让经过身份验证的用户尝试打开 Web 链接。因此,
我正在使用 https 设置一个独立的(非嵌入式) jetty 9.2.1。 我在本地机器上使用自签名证书玩了一会儿,一切顺利。 现在我正在设置一个 uat 服务器(类似于我将在生产中获得的服务器),
我对 Web 开发(从今年 1 月开始)和 Web 安全(在不到一周前开始!)都是新手,所以如果我的问题完全没有受过教育、误导或简单愚蠢,请原谅我。 我工作的公司的主要产品是一个很好的老式客户端/服务
HTTPS头是否加密到什么程度(如果有的话)? 最佳答案 它们在通过SSL传输时被加密。没有专门用于 header 的特殊加密,HTTPS对整个消息进行加密。 关于https - HTTPS head
在 HTTPS 安全模型中,最薄弱的部分是浏览器中的可信 CA 列表。有人可以通过多种方式将额外的 CA 添加到用户信任错误的人的列表中。 例如,您公司的公用计算机或 PC。管理员可能会强制您信任自己
我们最近切换到 HTTPS,当提交我们的一个表单时,Firefox 会弹出: Although this page is encrypted, the information you have ent
我知道没有愚蠢的问题,但这是:您能否在完全支持 https 的网站上通过 AdSense 或其他方式转换基于上下文的广告? 最佳答案 更新: We’ve updated the AdSense ad
我是一名优秀的程序员,十分优秀!