linux监听服务器,Linux服务器监听程序

一个简单的服务器监听程序模型,旨在演示相关函数的用法,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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值