Вызов функции в потоке
Подскажите пожалуйста что я не так делаю. Мне необходимо вызвать функцию которая создает сокет в потоке , одтельно поток создаю, отдельно сокет создаю , а вот сокет в потоке стал проблемой. Ниже код.
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
#define DEFPORT 5000
#define DEFNUM 3
typedef struct options {
int port;
int number;
} info_t;
static int server(int port, int nmax)
{
int sockfd;
struct sockaddr_in recvaddr;
int mysock;
int numbytes;
socklen_t addr_len;
char buff[1024];
int rval;
int n = 10;
int broadcast=1;
if ((sockfd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
perror("create socet failure");
return -1;
}
if ((setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast)) == -1){
perror("setsockopt - SO_SOCKET ");
return -1;
}
memset(&recvaddr, 0, sizeof recvaddr);
recvaddr.sin_family = PF_INET;
recvaddr.sin_port = htons(port);
recvaddr.sin_addr.s_addr = INADDR_BROADCAST;
if (bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr)) == -1) {
perror("bind failed");
return -1;
}
printf("socket created\n");
sleep(20);
close (sockfd);
}
static void parse_args(int argc, char *argv[], info_t *info) {
int rez = 0;
int p = info->port, n = info->number;
while ((rez = getopt(argc, argv, "p:n:h")) != -1) {
switch (rez) {
case 'p':
p = atoi(optarg);
if (p <= 0 || p >= 65535) p = DEFPORT;
printf("%d\n",p);
break;
case 'n':
n = atoi(optarg);
if (n <= 0) n = DEFNUM;
break;
case 'h':
printf("\nUsage:\n\t-p PORT; -n NUMBER\n\n");
exit(0);
default:
break;
}
}
info->port = p;
info->number = n;
}
static void *
thread_func(void *arg) {
pthread_t next_thread;
pthread_create(&next_thread, NULL, server(.port, .number), 0);
pthread_join(next_thread, NULL);
return NULL;
}
int main (int argc, char *argv[])
{
info_t info = {
.port = DEFPORT,
.number = DEFNUM
};
parse_args(argc, argv, &info);
for (int n = 0; n <= DEFNUM; n++) {
thread_func;
}
return 0;
}