Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UDP回显服务器,每个客户端一个线程_C_Linux_Sockets_Udp_Echo - Fatal编程技术网

C UDP回显服务器,每个客户端一个线程

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 <

我有一个简单的TCP echo服务器,每个客户端有一个线程(它可以工作),所以我尝试将其转换为UDP,但在运行服务器后遇到了问题:

“pthread_create()资源暂时不可用”

。这是我的服务器代码:

#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);
}