[英]linux connect to same sockaddr across threads in c
I'm trying to get multiple sockets connecting to the same address and port in multiple threads by sharing a const struct sockaddr_in
passed to connect()
. 我试图通过共享传递给connect()
的const struct sockaddr_in
来使多个套接字连接到多个线程中的相同地址和端口。 But the connection cannot be established. 但是无法建立连接。
My code is like this: 我的代码是这样的:
#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);
}
and output like this 并输出像这样
It works in main
Cannot connect in foo
: Invalid argument
I can write and read the socket in main
, but fail in foo. 我可以在main
读写套接字,但在foo中失败。
What's wrong with the sockaddr_in
? sockaddr_in
什么问题?
Now I have to recreate the same sockaddr_in
in every thread every time to connect. 现在,每次连接时,我必须在每个线程中重新创建相同的sockaddr_in
。 Is there any efficient way to avoid these overhead? 有什么有效的方法可以避免这些开销?
I am on Ubuntu 16.04, with gcc 5.4.1 compiled and ran with 我在Ubuntu 16.04上,已编译并运行了gcc 5.4.1
$ gcc myconnect.c -lpthread && ./a.out
sizeof(server_address)
in function foo is the size of a struct sockaddr_in
pointer and not the size of struct sockaddr_in
as it needs to be. 函数foo中的sizeof(server_address)
是struct sockaddr_in
指针的大小,而不是struct sockaddr_in
所需的大小。 Similar (struct sockaddr*)&server_address
is not a pointer to the struct sockaddr_in
but a pointer to the pointer: 相似的(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) {
This should work instead: 应改为:
if (connect(sockfd, (struct sockaddr*)server_address, sizeof(*server_address)) != 0) {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.