C UDP回显服务器,每个客户端一个线程
我有一个简单的TCP echo服务器,每个客户端有一个线程(它可以工作),所以我尝试将其转换为UDP,但在运行服务器后遇到了问题: “pthread_create()资源暂时不可用” 。这是我的服务器代码:C UDP回显服务器,每个客户端一个线程,c,linux,sockets,udp,echo,C,Linux,Sockets,Udp,Echo,我有一个简单的TCP echo服务器,每个客户端有一个线程(它可以工作),所以我尝试将其转换为UDP,但在运行服务器后遇到了问题: “pthread_create()资源暂时不可用” 。这是我的服务器代码: #include <errno.h> #include <netinet/in.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <
#include <errno.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 1027
#define BACKLOG 5
#define MAXLINE 256
#define SA struct sockaddr
typedef struct serve_clientArg {
int socket;
SA *addr;
socklen_t addrlen;
} SCARGS;
void Pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
{
int rc;
rc = pthread_create(thread, attr, start_routine, arg);
if(rc) {
errno = rc;
error("pthread_create()");
}
}
我也有一个TCP客户端,在转换成UDP之后,它就可以工作了。我想我犯了一个愚蠢的错误,但我找不到。。。请帮我找出错误
for(;;) {
arg = Malloc(sizeof (SCARGS));
arg->socket = socket;
arg->addr = (SA*) &cliaddr;
arg->addrlen = sizeof (cliaddr);
Pthread_create(&thread, NULL, serve_client, (void*) arg);
}
您可以在一个无止境的循环中分配内存并创建新线程,而不需要任何阻塞(就像您在TCP中使用accept
所做的那样)。因此,它很快就会耗尽资源:
“pthread_create()资源暂时不可用”
除此之外,您在所有线程中使用相同的套接字。但是,当您只有一个套接字时,让多个线程处理它并没有真正的意义。我不确定您试图用这种设计实现什么。您的程序一直在创建线程,直到无法实现为止-您期望的是什么?
for(;;) {
arg = Malloc(sizeof (SCARGS));
arg->socket = socket;
arg->addr = (SA*) &cliaddr;
arg->addrlen = sizeof (cliaddr);
Pthread_create(&thread, NULL, serve_client, (void*) arg);
}