gpt4 book ai didi

C Accept Client Socket "Invalid Argument"添加信号线程时出错

转载 作者:行者123 更新时间:2023-11-30 16:23:59 25 4
gpt4 key购买 nike

我正在做一个类项目,但我遇到了一个问题。

我的项目需要一个计时器每15秒打印一次数据。它还需要捕获程序的终止。为了处理这两个任务,我创建了一个信号线程并捕获 SIGINT 和 SIGALRM(来自 setitimer)信号。我这里没有任何问题。

但是,我的服务器->客户端连接现在不再正常工作。我的套接字 ID 一直为 -1,错误为“无效参数”。这对我来说没有任何意义,因为如果我禁用信号线程,一切都会再次正常工作。我将粘贴下面的代码。

void * signal_thread(void * arg) {


while (1) {
int caught_signal;

sigwait(&mask, &caught_signal);

switch(caught_signal) {
case SIGINT:
puts("Server manually terminated!");
int i;
for(i = 0; i<clientCount; i++){
send(socketIds[i], "ServerShutDown", 255, 0);
}
break;
case SIGALRM:
printf("CAUGHT SIGALRM\n");
break;
default:
break;
}
}
}

int main(void) {
/* do the necessary setup, i.e. bind() and listen()... */
int rc;
pthread_t signal_tid;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGALRM);
rc = pthread_sigmask(SIG_BLOCK, &mask, NULL);

if (rc != 0)
puts("Sig mask error");

rc = pthread_create(&signal_tid, NULL, signal_thread, &mask);

if (rc!= 0)
puts("Sig thread error");




struct itimerval timer;
timer.it_value.tv_sec = 2;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 2;
timer.it_interval.tv_usec = 0;
setitimer (ITIMER_REAL, &timer, NULL);


int socket_desc , client_sock , c;
struct sockaddr_in server , client;
int sockfd, newsocket, length;
int port = 8778;
//Create socket

socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}

if(setsockopt(socket_desc, SOL_SOCKET, SO_REUSEADDR, &(int) {1}, sizeof(int)) < 0){
perror("setsockopt failed");
}

bzero((char*) &server, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);

//Bind
if( bind(socket_desc,(struct sockaddr *) &server , sizeof(server)) < 0)
{
//print the error message
perror("bind failed. Error");
return 1;
}

//Listen
listen(socket_desc , 5);

length = sizeof(struct sockaddr_in);


//Accept and incoming connection
puts("Waiting for incoming connections...");

pthread_t thread_id;
while( 1 )
{
int * socketPtr = malloc(sizeof(int));
newsocket = accept(socket_desc, (struct sockaddr *) &client, (socklen_t *) &c);
if (newsocket == -1) {
perror("Error at accept..");
}
printf("Accepted new client connection!\n");
socketIds[clientCount++] = newsocket;
if( pthread_create( &thread_id , NULL , handle_connection , &newsocket) < 0)
{
perror("could not create thread");
return 1;
}


//Now join the thread , so that we dont terminate before the thread
//pthread_join( thread_id , NULL);

}

if (client_sock < 0)
{
perror("accept failed");
return 1;
}

return 0;
}

所以我遇到的错误发生在这里:

if (newsocket == -1) {
perror("Error at accept..");
}

接受错误..:打印出无效的参数。

当我禁用此行时:

rc = pthread_create(&signal_tid, NULL, signal_thread, &mask);

错误停止。我非常困惑这个不相关的线程如何导致我的服务器客户端连接困惑。任何见解将不胜感激

编辑:解决了克里斯·特纳。我接受的长度参数中的字段错误。以前的工作方式很奇怪!

最佳答案

您从未为c分配一个合理的值,因此您在此处将随机垃圾传递给accept:

    newsocket = accept(socket_desc, (struct sockaddr *) &client, (socklen_t *) &c);

它可能是也可能不是合法值。因此,此调用的效果将是不可预测的。

关于C Accept Client Socket "Invalid Argument"添加信号线程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53748324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com