简体   繁体   English

Linux跨C连接到同一sockaddr线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM