linux下C实现客户端服务器通信框架

服务器端

首先等候客户连接请求,一旦连接成功则接受客户端发送过来的字符,采用带有头结点的链表方式存贮字符,每个结点存储一个字符,接着通过对链表实现插入删除操作,完成对字符的升序排序,最后将排序后字符发送给客户端。

客户端

首先与服务器相连,接着发送客户端名字,然后发送客户信息,接受到服务器发送来排序结果并且显示。


服务器端代码:server.c

#include <sys/types.h>  
    #include <sys/socket.h>  
    #include <stdio.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <unistd.h>  
    #include <stdlib.h>  
    #include <malloc.h>

struct LNode  
{  
    char data;  
    struct LNode *next;  
};  
  
//按升序创建链表,count为创建的链表的节点数目  
struct LNode *create(int count,char cdata[])  
{  
    int i=0;  
    struct LNode *pNode = NULL;  
    struct LNode *pNewNode = NULL;  
    struct LNode *head = NULL;  
   
  head = (struct LNode*)malloc(sizeof(struct LNode));
  head->next= NULL;
    for(i =0;i <count;i++)  
    {  
        pNewNode = (struct LNode*)malloc(sizeof(struct LNode));//分配节点空间  
       pNewNode->data=cdata[i];
	 pNewNode->next=NULL;
        if(head->next == NULL)    //指定头结点  
        {  
            head->next= pNewNode;  
         //   pNode = pNewNode;  
        }  
    	else   //有序插入
	{
		pNode=head;
		while(pNode->next!=NULL&&pNode->next->data<pNewNode->data){
			pNode=pNode->next;
		}
		pNewNode->next=pNode->next;
		pNode->next=pNewNode;
	}
    }  
	return head; 
    
} 



    int main()  
    {  
        int server_sockfd,client_sockfd;  
        int server_len,client_len;  
        struct sockaddr_in server_address;  
        struct sockaddr_in client_address;  
        int i,btye,j=0;  
        int rleng=0,sleng=0;
        char char_recv[100],char_send[100];    
	 struct LNode *node,*p;  

        server_address.sin_family = AF_INET;  
        server_address.sin_addr.s_addr = inet_addr("127.0.0.1");  
        server_address.sin_port = 8080;  
        server_len = sizeof(server_address);  
          
        server_sockfd = socket(AF_INET,SOCK_STREAM,0);  
          
        bind(server_sockfd,(struct sockaddr *)&server_address,server_len);  
          
        listen(server_sockfd,5);  
        printf("server waiting for connect\n");  
          
        client_len = sizeof(client_address);  
        client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,(socklen_t *)&client_len);  
          

      if(btye = recv(client_sockfd,&rleng,1,0) == -1)  //收长度
        {  
            perror("recvleng");  
            exit(EXIT_FAILURE);  
        }  


        if(btye = recv(client_sockfd,&char_recv,rleng,0) == -1)  //收数据
        {  
            perror("recv");  
            exit(EXIT_FAILURE);  
        }  

      
       printf("receive from client is:");
	while(j<rleng){
		//char_send[j]=char_recv[j];
        printf("%c",char_recv[j++]);
       }
     printf("\n");


	node = create(rleng,char_recv);  //处理发送数据
	j=0;
	p=node->next;
	while(p){
       char_send[j++]=p->data;
         p=p->next;
   }

     sleng=j+1;
      if(btye = send(client_sockfd,&sleng,1,0) == -1)  //发长度
        {  
            perror("sendleng");  
            exit(EXIT_FAILURE);  
        }  


        if(btye = send(client_sockfd,&char_send,sleng,0) == -1)  //发数据
        {  
            perror("send");  
            exit(EXIT_FAILURE);  
        }  


        shutdown(client_sockfd,2);  
        shutdown(server_sockfd,2);   
        return 0;  
    }  

客户端代码:client.c

#include <sys/types.h>  
    #include <sys/socket.h>  
    #include <stdio.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <unistd.h>  
    #include <stdlib.h>  
    int main()  
    {  
        int sockfd;  
        int len;  
        struct sockaddr_in address;  
        int result;  
        int i,byte,j=0;  
        

	  int rleng=0,sleng=0;
	  char char_recv[100],char_send[100];
 
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)  //socket套接字
        {  
            perror("socket");  
            exit(EXIT_FAILURE);  
        }  
        address.sin_family = AF_INET;  
        address.sin_addr.s_addr = inet_addr("127.0.0.1");  
        address.sin_port = 8080;  
        len = sizeof(address);  
        if((result = connect(sockfd,(struct sockaddr *)&address,len)) == -1)  //建立链接
        {  
            perror("connect");  
            exit(EXIT_FAILURE);  
        }  
      
       printf("please enter the context you want to send to server and the end of !:");  
	
	 while(j<100 && char_send[j-1]!='!'){  //输入
        scanf("%c",&char_send[j++]); 
         }		  
                 
	sleng=j-1;
      if(byte = send(sockfd,&sleng,1,0) == -1)  //发长度
        {  
            perror("sendleng");  
            exit(EXIT_FAILURE);  
        }  

        if(byte = send(sockfd,&char_send,sleng,0) == -1)  //发数据
        {  
            perror("send");  
            exit(EXIT_FAILURE);  
        }  

        if(byte = recv(sockfd,&rleng,1,0) == -1)  //收长度
        {  
            perror("recv");  
            exit(EXIT_FAILURE);  
        }  

 
     if(byte = recv(sockfd,&char_recv,rleng,0) == -1)  //收数据
        {  
            perror("recv");  
            exit(EXIT_FAILURE);  
        }  
       printf("receive from server is:");
	j=0;
	while(j<rleng){
        printf("%c",char_recv[j++]);
       }
     printf("\n");


        close(sockfd);  //断开链接
        exit(0);  
    }  

实验操作如图所示,先打开两个终端分别编译,就能进行相互通信了。







Webadmin!是一个免费的开源框架,用于为Linux系统的快速搭建统一、稳定、易用的Web管理系统。 WebAdmin系统由三部分组成:WEB图形用户接口、WebAdmin守护进程和进程监视程序。Web图形用户接口(WebGUI)是WebAdmin系统的前端部分,为用户提供一个统一、易操作的图形界面。WebAdmin守护进程 (WebAdmind)是WebAdmin系统的后台部分,实时监视WebGUI生成的配置文件,并根据配置文件的变化情况,启动或停止相应的服务进程,WebAdmin进程监视程序(DaemonWatcher)用于实时监视WebAdmind启动的服务进程的运行状况,一旦发现启动的服务进程异常中止,立即重启中止的服务进程,从而确保系统可靠稳定运行。 WebAdmin!提供了一个结构化的WebAdmin开发框架,它的前后台部分均采用插件式的程序开发方法,借助提供的插件开发模板,WebAdmin系统开发者不必关WebAdmin开发框架的具体实现,就可设计出界面统一、操作简单、安全稳定的WebGUI界面。与WebGUI相对应,Webadmind也是采用插件式的程序开发方法。WebAdmind插件与WebGUI插件一一对应完成对界面操作的响应。DaemonWatcher是一个独立的进程监视程序,是为确保WebAdmind启动的进程能够不可间断地提供服务,一旦发现被监视程序发生异常中止,DaemonWatcher将根据进程的启动脚本立即启动被中止进程。 WebAdmin是一个用C语言设计的易用的图形用户接口开发框架,C语言的高可移植性使得WebAdmin可以广泛应用于包括Linux、Unix、Windows及各种嵌入式操作系统中,编译WebAdmin系统除Libxml2库处不需要额外的C函数库支持。WebAdmin提供了丰富的API函数,开发者可以根据自己的需要定制个性化的WebAdmin系统。 WebAdmin系统的界面风格也可以自己定制,对于OEM厂商可以根据需要修改界面风格,满足定制要求。 WebAdmin的开放设计思想,为WebAdmin系统的不断发展普奠定了基础,无数开发者提供了开源插件模块,用户甚至不用写一行代码就可根据自己的需要设计WebAdmin系统。 【简单使用方法】:下载后将压缩文件上传到Linux系统中,用tar xvfz webadmin-devel-1.3.tar.gz解压,解压后进入webadmin-devel目录,执行./configure,make命令后将会在test/webui目录下生成一个webadmin.cgi文件,将此文件拷贝到apache下的WEB根目录下cgi-bin目录下即可,为测试webadmin.cgi,还需将htdocs目录下的文件拷贝到apache的WEB根目录下,将etc目录中的所有文件拷贝到根目录下的etc中,最后用浏览器访问你的apache Web服务器即可看到Linux系统的WEB管理界面。 【说明】:编译此源码需要libxml2库的支持 有技术问题可以访问官方网站:http://www.webadminc.com,联系电话:13311223928
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值