Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13362
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-18 23:11
文章分类

全部博文(12)

文章存档

2017年(11)

2016年(1)

我的朋友

分类: LINUX

2016-11-22 21:04:54

一个简单的服务器监听程序模型,旨在演示相关函数的用法,Linux3.13下编译通过。

 

 

#include

#include

#include

#include

#include

#include


 

/*TCP接口信息*/

struct tcp_info {

    short          sCommType;       /*类型:0 TCP*/

    unsigned long  ulIPAddr;        /*相关类型的IP*/

    unsigned short usPort;          /*相关类型的端口*/

};

 

/*服务端TCP信息*/

typedef struct tcp_info server_info;

 

/*客户端TCP信息*/

typedef struct tcp_info client_info;

 

/*解析客户端IP*/

typedef union __endian_long_tag {

    struct {

        unsigned char A;

        unsigned char B;

        unsigned char C;

        unsigned char D;

 

    } Byte;

    unsigned  long Dword;

 

} DWORDENDIAN;

 

 

#define SERVER_IP      "192.168.1.103"  //服务器IP

#define SERVER_PORT    "1235"        //端口号,自行定义

 

int CreateTCP(server_info *server)

{

    struct sockaddr_in sin;

    int iLen;

    int iConnID;

   

    iLen = (int)(sizeof(struct sockaddr_in));

    memset(&sin, 0, iLen);

   

    if (server->sCommType != 0) {

        printf("Not TCP type!\n");

        return -1;

    }

   

    iConnID = socket(PF_INET, SOCK_STREAM, 0);

    if (iConnID < 0) {

        printf("TCP:Create socket error:[%s]!\n", (char *)strerror(errno));\

        return -1;

    }

   

    const int REBINDON = 1;

    setsockopt(iConnID, SOL_SOCKET, SO_REUSEADDR, &REBINDON, sizeof(REBINDON));

   

    sin.sin_family = AF_INET;

   

    sin.sin_addr.s_addr = (unsigned long)(server->ulIPAddr);

    sin.sin_port = htons(server->usPort);

   

    if (bind(iConnID, (const struct sockaddr *)&sin, iLen) < 0) {

        printf("TCP:Bind Server IP or port error:[%s]!\n", (char *)strerror(errno));

        return -1;

    }

   

    if (listen(iConnID, 5) < 0) {

        printf("TCP:Listen Server socket error:[%s]!\n", (char *)strerror(errno));

        return -1;

    }

   

    return iConnID;

   

}

 

int main(void)

{

    int           iFd;

    int           iClifd;

    server_info   server;

    client_info   client;

   

    memset(&server, 0, sizeof(server_info));

    memset(&client, 0, sizeof(client_info));

   

    server.sCommType = 0;

    server.ulIPAddr = inet_addr(SERVER_IP);

    server.usPort = atoi(SERVER_PORT);

   

    printf("father_pid=[%d]\n", getpid());

   

    iFd = CreateTCP(&server);

    if (iFd < 0) {

        printf("CreateTCP error!\n");

        return 1;

    }

   

    client.sCommType = 0;

   

    sleep(3);

    while(1) {

        struct sockaddr_in sin;

        int iLen;

       

        iLen = (int)(sizeof(struct sockaddr_in));

        memset(&sin, 0, iLen);

       

        iClifd = accept(iFd, (struct sockaddr *)&sin, &iLen);

        if (iClifd < 0)

            continue;

       

        if (fork() == 0) {

            DWORDENDIAN nIps;

            char clientsource[15];

           

            memset(clientsource, 0, sizeof(clientsource));

            iFd = -1;

            nIps.Dword = sin.sin_addr.s_addr;

           

            printf("child_pid=[%d]\n", getpid());

           

            sprintf(clientsource, "%3.3d%3.3d%3.3d%3.3d", nIps.Byte.A, nIps.Byte.B, nIps.Byte.C, nIps.Byte.D);

            printf("clientsource=[%s]\n", clientsource);

        }

    }

}

 

文件保存为server.c,执行”gcc server.c”,执行./a.out后,使用TCP助手连接,每次连接可看到客户端IP

头文件不显示,附上帖子地址:


阅读(1120) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:函数指针使用方法

给主人留下些什么吧!~~