- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个类项目,但我遇到了一个问题。
我的项目需要一个计时器每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/
在 HTTP 中,您可以在请求中指定您的客户端可以使用 accept header 接受响应中的特定内容,其值如 application/xml。内容类型规范允许您在内容类型中包含参数,例如chars
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
我的 RESTFul API 只能响应 JSON 编码的数据(即我所有的 header 都有 Content-Type: application/json)。如果请求具有不允许 JSON 的 Acce
我有 C linux TCP 客户端/服务器应用程序。我想出了一个奇怪的场景,但我不知道这个应用程序是否有任何后果。我有一个可以接受 N 个连接的服务器端,例如这个服务器将接受 100 个连接。在这种
我试图找出 的可能值范围接受 和 接受-联系 header 字段,但我在 RFC 中找不到完整列表。有谁知道他们在哪里?我经常看到 Accept: application/sdp;level=1,
在 TCP 套接字代码中,我们创建了 2 个套接字。第一个接受新连接,第二个接受来自客户端的数据并在新连接建立时创建。 TCP header 中的哪个控制位允许服务器知道将此段传递给 ServerSo
我可以设置 Request.Content-Type = ... , Request.Content-Length = ... 如何设置Accept和Accept-Language? 我想上传一个文件
假设A是服务器,B是客户端。 B 创建一个到服务器 A 的套接字 b 并 ServerSocket.accept() 创建一个相应的套接字 a 对于客户端 B 现在,如果服务器 A 关闭了 a 但客户
如果客户端connect()先于服务端accept()成功,那么客户端如何知道服务端accept()成功呢?如果在 connect() 成功和服务器 accept() 之间的时间间隔调用 send()
这是我的代码: void error(const char *msg) { perror(msg); exit(1); } void sServer::acceptClientConn
在我的 pom.xml 中有以下详细信息 org.codehaus.jackson jackson-core-asl 1.9.13
假设我有两个如下所示的端点: @GET @Path("/blah") @Produces(MIME_TYPE_1) public Thing getThing() { .... } @GET
我的 Controller : @RestController public class ClawerController { @RequestMapping("/hello"
我不想要可视化 merge 工具,我也不希望必须 vi 冲突文件并手动在 HEAD(我的)和导入的更改(他们的)之间进行选择。大多数时候,我要么想要他们的所有更改,要么想要我的所有更改。通常这是因为我
我正在使用 spring 4.1.1.RELEASE 并包括: pom 中的 jackson-core-asl 1.9.13 和 jackson-mapper-asl 1.9.13 来创建一个带有 R
我正在尝试开发自己的基于非阻塞 NIO 消息的通信库。我已经阅读了 1000 个关于它的教程和书籍章节,我认为最终我得到了一些可以在很少的同时连接下工作的东西。但是当我在服务器端共存许多连接时,我遇到
我正在尝试编写一个 Bind 元编程模板辅助元函数,将模板参数绑定(bind)到某物。 我有一个简单的模板元函数的工作实现: template struct MakePair { using
我使用 spring 构建 Restful API,当我访问以下方法时: // get the entity in DB by using id number @RequestMapping(
只是想知道是否有一种方法可以通过 ASP.NET Core 中的属性强制检查 HTTP header 值是否属于一组给定值(例如 application/json,应用程序/xml) 我知道有 Pro
我是一名优秀的程序员,十分优秀!