【发布时间】:2021-03-10 11:42:02
【问题描述】:
我有一个简单的 TCP 回显服务器,每个客户端一个线程(它可以工作),所以我尝试将其转换为 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()");
}
}
reads() 和 writen() 正在使用 recvfrom() 和 sendto() 函数
void *serve_client(void* arg)
{
char s[MAXLINE];
ssize_t rc;
SCARGS *args = Malloc(sizeof (SCARGS));
args = (SCARGS*) arg;
int socket = args->socket;
SA *addr = args->addr;
socklen_t addrlen = args->addrlen;
free(arg);
pthread_detach(pthread_self());
while((rc = reads(socket, s, MAXLINE, addr, &addrlen)) > 0) {
writen(socket, s, rc, addr, addrlen);
}
Close(socket);
return NULL;
}
int main(void)
{
int socket;
struct sockaddr_in servaddr;
struct sockaddr_in cliaddr;
SCARGS *arg;
pthread_t thread;
socket = Socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
Bind(socket, (SA *) &servaddr, sizeof(servaddr));
for(;;) {
arg = Malloc(sizeof (SCARGS));
arg->socket = socket;
arg->addr = (SA*) &cliaddr;
arg->addrlen = sizeof (cliaddr);
Pthread_create(&thread, NULL, serve_client, (void*) arg);
}
return 0;
}
我也有一个 TCP 客户端,在转换为 UDP 后它可以工作。我想我犯了一个愚蠢的错误,但我找不到它...请帮我找出错误!
【问题讨论】:
-
您的程序一直在创建线程,直到无法创建线程 - 您期待什么?