gpt4 book ai didi

c - 从http套接字中提取位置

转载 作者:行者123 更新时间:2023-11-30 17:48:15 25 4
gpt4 key购买 nike

我将以下 http 回复保存在名为 source.txt 的本地文件中:

HTTP/1.1 301 Moved
Connection: close
Content-length: 111
Location: https://11.12.13.14:81/
Content-type: text/html; charset="utf-8"

<html><head><META HTTP-EQUIV="refresh" CONTENT="0;URL=https://11.12.13.14:81/"></head><body></body></html>

以及以下代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXBUFLEN 1024

char* getLocation(char* source)
{
const char *p1 = strstr(source, "Location:")+10;
const char *p2 = strstr(p1, "\n");
size_t len = p2-p1;
char *res = (char*)malloc(sizeof(char)*(len+1));
strncpy(res, p1, len);
res[len] = '\0';
return res;
}

char* getData(char* source)
{
const char *p1 = strstr(source, "://")+3;
const char *p2 = strstr(p1, "\n");
size_t len = p2-p1;
char *res = (char*)malloc(sizeof(char)*(len+1));
strncpy(res, p1, len);
res[len] = '\0';
return res;
}

int main()
{
char source[MAXBUFLEN];
char host[100];
int port;
FILE *fp = fopen("source.txt", "r");
if (fp != NULL) {
size_t newLen = fread(source, sizeof(char), MAXBUFLEN, fp);
if (newLen == 0) {
fputs("Error reading file", stderr);
} else {
source[++newLen] = '\0';

//extraction code
char* line = getLocation(source);
printf("getLocation result: %s\n", line);
if (strstr(line, "://"))
{
char* res = getData(line);//here is the error
printf("getData result: %s\n", res);
if (strstr(res, ":"))
{
sscanf(res, "%[^:]:%d[^/]", host, &port);
printf("host: %s | port: %d\n", host, port);
}
else
printf("delimiter not found\n");
}
else
printf("no link\n");
//
}
}
fclose(fp);
}

该程序运行良好,但非常丑陋。

有什么方法可以改进代码以避免执行如此多的操作吗?

我的意思是以某种方式合并这两个函数 getLocation 和 getData ...

编辑:我的错误,getData 必须从资源中提取而不是从源中提取

最佳答案

像这样的事情是显而易见的方式:

char * getstuff(char * source, char * label) {
const char *p1 = strstr(source, label) + strlen(label);
const char *p2 = strstr(p1, "\n");
size_t len = p2-p1;

char *res = malloc(len+1);
if ( res == NULL ) {
fputs("Couldn't allocate memory.", stderr);
exit(EXIT_FAILURE);
}

strncpy(res, p1, len);
res[len] = '\0';

return res;
}

char* getLocation(char* source) {
return getstuff(source, "Location: ");
}

char* getData(char* source) {
return getstuff(source, "://");
}

或者只使用 getstuff() 并完全省略 getLocation()getData()(如果您只想调用)每个函数一次。

关于c - 从http套接字中提取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18649081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com