FFL_NetLoopbackServer.c 1.3 KB
Newer Older
L
libb 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
 /*
 *  This file is part of FFL project.
 *
 *  The MIT License (MIT)
 *  Copyright (C) 2017-2018 zhufeifei All rights reserved.
 *
 *  FFL_socketLoopbackServer.c
 *  Created by zhufeifei(34008081@qq.com) on 2017/8/12.
 *  https://github.com/zhenfei2016/FFLv2-lib.git
 *  当前机子的环回地址(127.0.0.1)创建服务器,参考android adb代码
 *
 */
#include "internalSocket.h"
#include <net/FFL_Net.h>

 /*
 *  如果fd指向的为NULL 则内部会进行socket的创建
 */
#define LISTEN_BACKLOG 4
SOCKET_STATUS FFL_socketLoopbackServer(int port, int type, NetFD *fd){
    struct sockaddr_in addr;
    int s, n;
	FFL_Zerop(&addr);
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

	if (*fd == 0) {
		s = socket(AF_INET, type, 0);
		if (s < 0) {
			return FFL_ERROR_SOCKET_CREATE;
		}
	}
	else {
		s = *fd;
	}

    n = 1;
    setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(const char*) (&n), sizeof(n));
    if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
        FFL_socketClose(s);
		return FFL_ERROR_SOCKET_BIND;
    }

    if (type == SOCK_STREAM) {
        int ret;
        ret = listen(s, LISTEN_BACKLOG);

        if (ret < 0) {
			FFL_socketClose(s);
            return FFL_ERROR_SOCKET_LISTEN;
        }
    }

	*fd = s;
    return FFL_SOCKET_OK;
}