簡體   English   中英

accept()函數中斷程序。 C

[英]accept() function breaks program. C

我不知道為什么以下服務器線程中的accept()函數會破壞程序。

頭文件

/*
 * tcpip_server.h
 *
 *  Created on: 2013-01-10
 *      Author: Lukasz
 */

#ifndef TCPIP_SERVER_H_
#define TCPIP_SERVER_H_

int init_tcpip_server();

#endif /* TCPIP_SERVER_H_ */

.c文件

*
 * tcpip_server.c
 *
 *  Created on: 2013-01-10
 *      Author: Lukasz
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

#include "tcpip_server.h"


/* Logger thread prototype */
void *tServerThreadFunc(void *);

/* Thread variable */
pthread_t tServerThread;
/* Thread attributes structure */
pthread_attr_t aServerThreadAttr;

/**
 * Function crates server thread
 */
int init_tcpip_server() {

    int status;
    printf("begginning init_tcpip_server()\n");
    /* Set server scheduling policy to FIFO */
    pthread_attr_init(&aServerThreadAttr);
    pthread_attr_setschedpolicy(&aServerThreadAttr, SCHED_FIFO);
    printf("before ServerThread createion\n");
    /* Create server thread */
    if ((status = pthread_create( &tServerThread, NULL, tServerThreadFunc, &aServerThreadAttr))) {
        fprintf(stderr, "Cannot create thread.\n");
        return 0;
    }

    return 0;
}

/**
 * Server thread function
 */
void *tServerThreadFunc(void *cookie) {

    /* Scheduling policy: FIFO or RR */
    int policy;
    /* Structure of other thread parameters */
    struct sched_param param;
    /* Socket address structure */
    struct sockaddr_in socket_addr;
    /* Socket variable */
    int srv_socket;
    /* Buffer */
    char buff[100];
    char answer[100];


    /* Read modify and set new thread priority */
    pthread_getschedparam( pthread_self(), &policy, &param);
    param.sched_priority = sched_get_priority_min(policy);
    pthread_setschedparam( pthread_self(), policy, &param);
    printf("before socket\n");
    /* Initialize socket variable */
    srv_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if(srv_socket == -1) {
        fprintf(stderr, "Cannot create socket\n");
        return 0;
    }

    /* Initialize socket address to 0*/
    memset(&socket_addr, 0, sizeof(socket_addr));
    /* Set socket address parameters */
    socket_addr.sin_family = AF_INET;
    socket_addr.sin_port = htons(1200);
    socket_addr.sin_addr.s_addr = INADDR_ANY;

    /* Bind socket to socket address struct */
    if(bind(srv_socket, (struct sockaddr *)&socket_addr, sizeof(socket_addr)) == -1) {
        fprintf(stderr, "Cannot bind socket\n");
        close(srv_socket);
        return 0;
    }

    /* Start to listen on created socket */
    if(listen(srv_socket, 10) == -1) {
        fprintf(stderr, "Cannot start to listen\n");
        close(srv_socket);
        return 0;
    }

    printf("Server is waiting.\n");

    /* Wait until somebody open connection with you */
    int srv_connection = accept(srv_socket, NULL, NULL); /* <= program breaks here. */

    printf("test\n");

    /* Check if connection is OK */
    if(srv_connection < 0) {
        fprintf(stderr, "Accept connection failed\n");
        close(srv_socket);
        return 0;
    }

    for(;;) {

    }
    return 0;
}

該程序將顯示“服務器正在等待”,但永遠不會到達“測試”,並且只會停止工作。 我使用init_tcpip_server()函數從同一項目中的另一個.c文件啟動它。 編譯期間沒有錯誤。

好。 我發現自己失敗了。 我是線程的新手,並且不習慣於主線程繼續工作並退出,關閉所有內容。 在這種情況下,“服務器正在等待”和“測試”之間。 在延長主時間后,一切正常。 很抱歉浪費您的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM