免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1975 | 回复: 2
打印 上一主题 下一主题

[Linux] Linux服务器监听程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-21 20:40 |只看该作者 |倒序浏览
Linux服务器监听程序
一个简单的服务器监听程序模型,旨在演示相关函数的用法,Linux3.13下编译通过。
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
/*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("CreateTCPerror!\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,执行”gccserver.c”,执行./a.out后,使用TCP助手连接,每次连接打印客户端IP。

论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
2 [报告]
发表于 2016-11-22 10:02 |只看该作者
有演示结果么?

论坛徽章:
0
3 [报告]
发表于 2016-11-22 20:58 |只看该作者
回复 2# 王楠w_n

改一下你的服务IP,编译就可以运行的。

QQ图片20161122205533.png (12.37 KB, 下载次数: 43)

QQ图片20161122205533.png

QQ图片20161122205656.png (16.31 KB, 下载次数: 47)

QQ图片20161122205656.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP