我正在嘗試修改 wrk 代碼庫,以便它將連接到多個服務器而不僅僅是一個。我已經找到并正在connect_socket為此修改該函式,但在運行時得到以下輸出:
143.204.186.52
connect: Invalid argument
64.190.62.111
connect: Invalid argument
45.33.18.44
connect: Invalid argument
64.190.62.111
connect: Invalid argument
52.128.23.153
connect: Invalid argument
173.255.194.134
connect: Invalid argument
^C Thread Stats Avg Stdev Max /- Stdev
Latency 0.00us 0.00us 0.00us -nan%
Req/Sec 0.00 0.00 0.00 -nan%
0 requests in 1.66s, 0.00B read
Socket errors: connect 100000, read 0, write 0, timeout 0
Requests/sec: 0.00
Transfer/sec: 0.00B
這是我正在呼叫的修改后的函式:
static int connect_socket(thread *thread, connection *c) {
struct addrinfo *addr = thread->addr;
struct aeEventLoop *loop = thread->loop;
int fd, flags;
char ip[128];
struct sockaddr_in myaddr;
if (fscanf(fp, "8s", ip) == 1) {
printf("%s\n", ip);
}
memset(&myaddr, '0', sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(80);
if(inet_pton(AF_INET, ip, &myaddr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
}
fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
if (connect(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1) {
if (errno != EINPROGRESS) goto error;
}
flags = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flags, sizeof(flags));
flags = AE_READABLE | AE_WRITABLE;
if (aeCreateFileEvent(loop, fd, flags, socket_connected, c) == AE_OK) {
c->parser.data = c;
c->fd = fd;
return fd;
}
error:
perror("connect");
thread->errors.connect ;
close(fd);
return -1;
}
我想這一定是我的論點有問題connect。任何想法我做錯了什么?
uj5u.com熱心網友回復:
這段代碼是一個邏輯混亂。
結構的使用addrinfo意味著該getaddrinfo()函式在執行緒啟動之前正在其他地方使用。
您的執行緒在 中傳遞,addrinfo然后根據該指定的 IP 地址型別創建套接字addrinfo,但忽略了存盤在中的實際 IP 地址addrinfo(可能是 IPv4 或 IPv6 地址)。相反,它從其他地方獲取 IP 地址作為字串,僅將其決議為 IPv4 地址,然后將其傳遞給connect()結構sockaddr_in體。connect()在這種情況下,如果套接字不是 IPv4 ( AF_INET) 套接字,即如果它是 IPv6 ( AF_INET6) 套接字,則可能會因“無效引數”錯誤而失敗,這需要一個sockaddr_in6結構。
要解決此問題,您需要:
擺脫
sockaddr_in并按原樣使用IP地址sockaddr:connect(fd, addr->ai_addr, addr->ai_addrlen)擺脫
sockaddr和硬編碼套接字型別AF_INET以匹配使用sockaddr_in:socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
uj5u.com熱心網友回復:
以下行有錯誤:
fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
它應該是:
fd = socket(AF_INET, addr->ai_socktype, addr->ai_protocol);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421477.html
標籤:
上一篇:Java-監聽本地主機和埠
