⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sock.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 5 页
字号:
	return mpi_errno;    }    return MPI_SUCCESS;}/* sock functions */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_init#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_init(){    int mpi_errno;    char *szNum, *szRange;    WSADATA wsaData;    int err;    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_INIT);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_INIT);    if (g_init_called)    {	g_init_called++;	/*printf("sock init %d\n", g_init_called);fflush(stdout);*/	/*	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_INIT);	return mpi_errno;	*/	return MPI_SUCCESS;    }    /* Start the Winsock dll */    if ((err = WSAStartup(MAKEWORD(2, 0), &wsaData)) != 0)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**wsasock", "**wsasock %s %d", get_error_string(err), err);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_INIT);	return mpi_errno;    }    /* get the socket buffer size */    szNum = getenv("MPICH_SOCKET_BUFFER_SIZE");    if (szNum != NULL)    {	g_socket_buffer_size = atoi(szNum);	if (g_socket_buffer_size < 0)	    g_socket_buffer_size = SOCKI_TCP_BUFFER_SIZE;    }    g_socket_rbuffer_size = g_socket_buffer_size;    g_socket_sbuffer_size = g_socket_buffer_size;    szNum = getenv("MPICH_SOCKET_RBUFFER_SIZE");    if (szNum != NULL)    {	g_socket_rbuffer_size = atoi(szNum);	if (g_socket_rbuffer_size < 0)	    g_socket_rbuffer_size = g_socket_buffer_size;    }    szNum = getenv("MPICH_SOCKET_SBUFFER_SIZE");    if (szNum != NULL)    {	g_socket_sbuffer_size = atoi(szNum);	if (g_socket_sbuffer_size < 0)	    g_socket_sbuffer_size = g_socket_buffer_size;    }    /* get the number of accepts to pre-post */    szNum = getenv("MPICH_SOCKET_NUM_PREPOSTED_ACCEPTS");    if (szNum != NULL)    {	g_num_posted_accepts = atoi(szNum);	if (g_num_posted_accepts < 1)	    g_num_posted_accepts = SOCKI_NUM_PREPOSTED_ACCEPTS;    }    /* check to see if a port range was specified */    szRange = getenv("MPICH_PORT_RANGE");    if (szRange != NULL)    {	szNum = strtok(szRange, ",.:"); /* tokenize min,max and min..max and min:max */	if (szNum)	{	    g_min_port = atoi(szNum);	    szNum = strtok(NULL, ",.:");	    if (szNum)	    {		g_max_port = atoi(szNum);	    }	}	/* check for invalid values */	if (g_min_port < 0 || g_max_port < g_min_port)	{	    g_min_port = g_max_port = 0;	}	/*	printf("using min_port = %d, max_port = %d\n", g_min_port, g_max_port);	fflush(stdout);	*/    }    init_state_struct(&g_wakeup_state);    g_wakeup_state.type = SOCKI_WAKEUP;    g_init_called = 1;    /*printf("sock init %d\n", g_init_called);fflush(stdout);*/    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_INIT);    return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_finalize#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_finalize(){    int mpi_errno;    sock_state_t *iter;    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_FINALIZE);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_FINALIZE);    if (!g_init_called)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_FINALIZE);	return mpi_errno;    }    g_init_called--;    if (g_init_called == 0)    {	iter = g_sock_list;	while (iter)	{	    if (iter->sock != INVALID_SOCKET)	    {		/*printf("sock %d not closed before finalize\n", iter->sock);fflush(stdout);*/		closesocket(iter->sock);		iter->sock = INVALID_SOCKET;	    }	    iter = iter->next_sock;	    if (iter == g_sock_list)	    {		/* catch loops */		/*printf("sock list has a loop\n");fflush(stdout);*/		break;	    }	}	WSACleanup();    }    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_FINALIZE);    return MPI_SUCCESS;}typedef struct socki_host_name_t{    char host[256];    struct socki_host_name_t *next;} socki_host_name_t;static int already_used_or_add(char *host, socki_host_name_t **list){    socki_host_name_t *iter, *trailer;    /* check if the host already has been used */    iter = trailer = *list;    while (iter)    {	if (strcmp(iter->host, host) == 0)	{	    return 1;	}	if (trailer != iter)	    trailer = trailer->next;	iter = iter->next;    }    /* the host has not been used so add a node for it */    iter = (socki_host_name_t*)MPIU_Malloc(sizeof(socki_host_name_t));    if (!iter)    {	/* if out of memory then treat it as not found */	return 0;    }    MPIU_Strncpy(iter->host, host, 256);    /* insert new hosts at the end of the list */    if (trailer != NULL)    {        trailer->next = iter;        iter->next = NULL;    }    else    {        iter->next = NULL;        *list = iter;    }    /* insert new hosts at the beginning of the list                                iter->next = *list;                                                             *list = iter;                                                                   */    return 0;}static void socki_free_host_list(socki_host_name_t *list){    socki_host_name_t *iter;    while (list)    {	iter = list;	list = list->next;	MPIU_Free(iter);    }}static int socki_get_host_list(char *hostname, socki_host_name_t **listp){    int mpi_errno;    struct addrinfo *res, *iter, hint;    char host[256];    socki_host_name_t *list = NULL;    /* add the hostname to the beginning of the list */    already_used_or_add(hostname, &list);    hint.ai_flags = AI_PASSIVE | AI_CANONNAME;    hint.ai_family = PF_UNSPEC;    hint.ai_socktype = SOCK_STREAM;    hint.ai_protocol = 0;    hint.ai_addrlen = 0;    hint.ai_canonname = NULL;    hint.ai_addr = 0;    hint.ai_next = NULL;    if (getaddrinfo(hostname, NULL, NULL/*&hint*/, &res))    {        mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**getinfo", "**getinfo %s %d", strerror(errno), errno);        return mpi_errno;    }    /* add the host names */    iter = res;    while (iter)    {        if (iter->ai_canonname)        {            already_used_or_add(iter->ai_canonname, &list);        }        else        {            switch (iter->ai_family)            {            case PF_INET:            case PF_INET6:                if (getnameinfo(iter->ai_addr, (socklen_t)iter->ai_addrlen, host, 256, NULL, 0, 0) == 0)                {                    already_used_or_add(host, &list);                }                break;            }        }        iter = iter->ai_next;    }    /* add the names again, this time as ip addresses */    iter = res;    while (iter)    {        switch (iter->ai_family)        {        case PF_INET:        case PF_INET6:            if (getnameinfo(iter->ai_addr, (socklen_t)iter->ai_addrlen, host, 256, NULL, 0, NI_NUMERICHOST) == 0)            {                already_used_or_add(host, &list);            }            break;        }        iter = iter->ai_next;    }    if (res)    {        freeaddrinfo(res);    }    *listp = list;    return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_hostname_to_host_description#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_hostname_to_host_description(char *hostname, char *host_description, int len){    int mpi_errno = MPI_SUCCESS;    socki_host_name_t *iter, *list = NULL;    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION);    if (!g_init_called)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION);	return mpi_errno;    }    mpi_errno = socki_get_host_list(hostname, &list);    if (mpi_errno != MPI_SUCCESS)    {        mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", 0);        goto fn_exit;    }    iter = list;    while (iter)    {        MPIU_DBG_PRINTF(("adding host: %s\n", iter->host));        mpi_errno = MPIU_Str_add_string(&host_description, &len, iter->host);        if (mpi_errno != MPI_SUCCESS)        {            mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_NOMEM, "**desc_len", 0);            goto fn_exit;        }        iter = iter->next;    } fn_exit:    socki_free_host_list(list);    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION);    return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_get_host_description#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_get_host_description(int myRank, 				    char * host_description, int len){    int mpi_errno;    char hostname[100];    DWORD length = 100;    char *env;    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION);    if (!g_init_called)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION);	return mpi_errno;    }    env = getenv("MPICH_INTERFACE_HOSTNAME");    if (env != NULL && *env != '\0')    {	MPIU_Strncpy(hostname, env, sizeof(hostname));    }    else    {	/*if (gethostname(hostname, 100) == SOCKET_ERROR)*/	/*if (!GetComputerName(hostname, &length))*/	if (!GetComputerNameEx(ComputerNameDnsFullyQualified, hostname, &length))	{	    mpi_errno = WSAGetLastError();	    mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**sock_gethost", "**sock_gethost %s %d", get_error_string(mpi_errno), mpi_errno);	    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION);	    return mpi_errno;	}    }    mpi_errno = MPIDU_Sock_hostname_to_host_description(hostname, host_description, len);    if (mpi_errno != MPI_SUCCESS)    {	mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", 0);    }    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION);    return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_create_set#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_create_set(MPIDU_Sock_set_t * set){    int mpi_errno;    HANDLE port;    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_CREATE_SET);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_CREATE_SET);    if (!g_init_called)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -