示例#1
0
int dare_server_init(dare_server_input_t *input)
{   
    int rc;
    
    /* Initialize data fields to zero */
    memset(&data, 0, sizeof(dare_server_data_t));
    
    /* Store input into server's data structure */
    data.input = input;
    data.cur_view = input->cur_view;
    data.my_address = input->my_address;
    
    /* Set log file handler */
    log_fp = input->log;
    
    /* Init server data */    
    rc = init_server_data();
    if (0 != rc) {
        free_server_data();
        fprintf(stderr, "Cannot init server data\n");
        return 1;
    }

    init_network_cb();

    poll_cb();

    return 0;
}
示例#2
0
int udp_module_connect(char **argv)
{
	int udpfd = 0;
	int success = 0;
	struct sockaddr_in udpsockaddr;

	init_server_data(argv, &udpsockaddr);
	udpfd = create_socket(AF_INET, SOCK_DGRAM);
	if (udpfd == -1) {
		fprintf(stdout, "UDP-Warning: create udp socket failed!\n");
		return -1;
	}

	success = bind(udpfd, (SA *)&udpsockaddr, sizeof(SA));
	if (success) {
		fprintf(stdout, "UDP-Error: udp bind failed\n");
		return -1;
	}
}
示例#3
0
文件: client.c 项目: Greeshma/DFS
/* Sets up a server:
 * Creates the server_data structure, adds it to the server list, and
 * then sets up socket communication */
int init(char *serverid, server_data **sdata)
{
    int flag;
    struct sockaddr_in server_addr;
    struct hostent* host=NULL;
    char g_server_addr[4];
    static int sock=-1;
    int ret, insertval=0;
    
    //find out host info right away
    host=gethostbyname(serverid);
    if (host) {
        memcpy(g_server_addr, host->h_addr, 4);
    }
    else {
        dprintf(stderr,"gethostbyname FAILED!\n");
        return -EHOSTUNREACH;
    }
    //use full addresses instead of host abbreviations
    //ie computer.abc.def.ghi instead of just computer
    if (strncmp(host->h_name,serverid,MAXADDR) != 0) {
        memset(serverid,0,MAXADDR);
        strncpy(serverid,host->h_name,MAXADDR);
    }

    server_data* sd = NULL;
    ret = get_info_ptr(&head,&tail,serverid,MAXADDR,(void *)&sd);
    if (ret < 0) {
        if (&head == NULL || serverid == NULL) {
            //an error occured, list not set up correctly or null serverid
            return ret;
        }
        else {
            //server could not be found in the list, set it up and add
            //it to the list
                     
            sd = (server_data*)calloc(sizeof(server_data),1);              
            init_server_data(sd);
            
            insertval = insert_info_ptr(&head,&tail,serverid,
                                        MAXADDR,(void *)sd);
            if (insertval<0) {
                //error inserting new sd into list
                return insertval;
            }
        }
    }

    /* This should only be true if the server was listed under host->h_name
     * and thus check_setup didn't see it.  */
    if (sd->g_mctx.sock > 0) {
        if (sdata) {
            *sdata=sd;
        }
        return 0;
    }
    
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;

    memcpy(&server_addr.sin_addr.s_addr, g_server_addr, 4);
    
    server_addr.sin_port = htons(server_port);

    sock=socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        dprintf(stderr, "ERROR: socket creation failed: %s\n",
                strerror(errno));
        return -1;
    }
    flag=1;

    if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
                   (char*) &flag, sizeof(int))) {
        dprintf(stderr, "ERROR: unable to set socket options.\n");
    }

    int rval = connect(sock, (struct sockaddr *)&server_addr,
                       sizeof(server_addr));
    if (rval != 0) {
        dprintf(stderr, "ERROR: connect failed: %s\n", strerror(errno));
            
        if (errno == ECONNREFUSED) {
            //check to see if a local directory for the server exists
            //if it does, remove it
            struct stat st;
            char dir_path[MAXPATH+LOCALSIZE];
            sprintf(dir_path, "%s/mnt/%s", local_path,serverid);
            int stret = stat(dir_path, &st);
            if (stret >= 0) {
                if (rmdir(dir_path)) {
                    perror("Error deleting directory of server");
                }
            }
            ret = -EHOSTUNREACH;
        }
        else
            ret = -1;
        
        return ret;
    }
        
    sd->g_mctx.sock=sock;

    if(my_ops.up_new_server) {
        char my_dns[4096];
        memset(my_dns,4096,0);
    
        gethostname(my_dns, 4095);
            
        if(my_ops.up_new_server(my_dns, serverid, sd->ctx) != PROCEED){
            shutdown(sd->g_mctx.sock, 2);
            sock = sd->g_mctx.sock = -1;
      
            return -1;
        }
    }
        
    //create the local directory, if it doesn't already exist
    struct stat st;
    char dir_path[MAXPATH+LOCALSIZE];
    sprintf(dir_path, "%s/mnt/%s", local_path, serverid);
    int stret = stat(dir_path, &st);
    if (stret < 0) {
        if (mkdir(dir_path, 0700)) {
            perror("Failed to create local .corefs/mnt/server directory");
            exit(1);
        }
    }
    
    //set the server data pointer
    if (sdata) {
        *sdata = sd;
    }

    return 0;
}