MinGW Socket-create_socket

来源:互联网 发布:身份证读卡器软件 编辑:程序博客网 时间:2024/05/14 08:44
d:\linux\linuxkernel\WORKING_DIRECTORY\android-omap-20111108-gingerbread\system\core\init\util.c

/*
 * create_socket - creates a Unix domain socket in ANDROID_SOCKET_DIR
 * ("/dev/socket") as dictated in init.rc. This socket is inherited by the
 * daemon. We communicate the file descriptor's value via the environment
 * variable ANDROID_SOCKET_ENV_PREFIX<name> ("ANDROID_SOCKET_foo").
 * http://blog.csdn.net/sanbrother/article/details/4031353
 * https://www.allegro.cc/forums/thread/370013/370226#target
 * D:\linux\linuxkernel\WORKING_DIRECTORY\ango\init\socket\MinGW Socket.c
 */
#define D_HOST      "localhost"
#define D_PORT      4344
int create_socket(const char *name, int type, mode_t perm, uid_t uid, gid_t gid)
{
//    struct sockaddr_un addr;
    struct sockaddr_in addr;
    struct hostent *host;
//    int fd, ret;
    int result;
    unsigned int descriptor;


    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData)){
printf("Failed to WSAStartup '%s': %s\n", name, strerror(errno));
        ERROR("Failed to WSAStartup '%s': %s\n", name, strerror(errno));
        return -1;
    }




    /*  create a socket  */
    descriptor = socket(PF_INET, SOCK_STREAM, 0);
    if (descriptor == -1) {
printf("Failed to open socket '%s': %s\n", name, strerror(errno));
        ERROR("Failed to open socket '%s': %s\n", name, strerror(errno));
//        perror("socket");
        return (1);
    }


//    fd = socket(PF_UNIX, type, 0);
//    if (fd < 0) {
// printf("Failed to open socket '%s': %s\n", name, strerror(errno));
//        ERROR("Failed to open socket '%s': %s\n", name, strerror(errno));
//        return -1;
//    }


//    memset(&addr, 0 , sizeof(addr));
//    addr.sun_family = AF_UNIX;
//    snprintf(addr.sun_path, sizeof(addr.sun_path), ANDROID_SOCKET_DIR"/%s",
//             name);
//
//    ret = unlink(addr.sun_path);
//    if (ret != 0 && errno != ENOENT) {
//        ERROR("Failed to unlink old socket '%s': %s\n", name, strerror(errno));
//        goto out_close;
//    }


    /*  get information about the host  */
    memset(&addr, 0, sizeof(addr));
    host = gethostbyname(D_HOST);
    if (host == NULL) {
printf("Failed to gethostbyname '%s': %s\n", name, strerror(errno));
        perror("gethostbyname");
        closesocket(descriptor);
        WSACleanup();
        return (1);
    }


    /*  bind the socket to an address and port  */
    memcpy(&addr.sin_addr, host->h_addr_list[0], sizeof(host->h_addr_list[0]));
    addr.sin_family = AF_INET;
    addr.sin_port   = htons(D_PORT);
    result = bind(descriptor, (struct sockaddr *)&addr, sizeof(addr));
    if (result == -1) {
printf("Failed to bind '%s': %s\n", name, strerror(errno));
        perror("bind");
        closesocket(descriptor);
        WSACleanup();
        return (1);
    }


 
//    ret = bind(fd, (struct sockaddr *) &addr, sizeof (addr));
//    if (ret) {
//        ERROR("Failed to bind socket '%s': %s\n", name, strerror(errno));
//        goto out_unlink;
//    }


//    chown(addr.sun_path, uid, gid);
//    chmod(addr.sun_path, perm);


//    INFO("Created socket '%s' with mode '%o', user '%d', group '%d'\n",
//         addr.sun_path, perm, uid, gid);


//    return fd;
    return descriptor;


//out_unlink:
//    unlink(addr.sun_path);
//out_close:
//    close(fd);
//    return -1;
}
原创粉丝点击