gpt4 book ai didi

c - linux在c中跨线程连接到相同的sockaddr

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:30 24 4
gpt4 key购买 nike

我试图通过共享传递给 connect()const struct sockaddr_in 来让多个套接字连接到多个线程中的相同地址和端口。但是无法建立连接。

我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>

void* foo(void* sa) {
struct sockaddr_in* server_address = (struct sockaddr_in*) sa;
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) != 0) {
perror("Cannot connect in foo\n");
exit(1);
}
// do something...
return NULL;
}

int main(int argc, char* argv[]) {
const struct sockaddr_in server_address = {
.sin_addr = inet_addr("127.0.0.1"),
.sin_port = htons(80),
.sin_family = AF_INET
};
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) != 0) {
perror("Cannot connect in main\n");
exit(1);
} else {
printf("It works in main\n");
}
pthread_t t;
pthread_create(&t, NULL, foo, (void*)&server_address);
pthread_join(t, NULL);
}

像这样输出

It works in main
Cannot connect in foo
: Invalid argument

我可以在 main 中写入和读取套接字,但在 foo 中失败。

sockaddr_in 有什么问题?

现在我每次连接时都必须在每个线程中重新创建相同的 sockaddr_in。有什么有效的方法可以避免这些开销?

我在 Ubuntu 16.04 上,编译并运行了 gcc 5.4.1

$ gcc myconnect.c -lpthread && ./a.out

最佳答案

函数 foo 中的

sizeof(server_address)struct sockaddr_in pointer 的大小,而不是 struct sockaddr_in< 的大小 因为它需要。类似(struct sockaddr*)&server_address不是指向struct sockaddr_in的指针而是指向指针:

void* foo(void* sa) {
struct sockaddr_in* server_address = (struct sockaddr_in*) sa;
...
if (connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) != 0) {

这应该可以代替:

if (connect(sockfd, (struct sockaddr*)server_address, sizeof(*server_address)) != 0) {

关于c - linux在c中跨线程连接到相同的sockaddr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49831208/

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