linux 网络编程:多客户请求服务器( C/S )实例

注意:可以开启一个server和多个client,同时可以对server进行发送data处理,请注意client的参数,格式是:./client  IP   char_data
IP:就是server所在的IP,char_data就是发送的数据
 
server.c


#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<signal.h>
#include<sys/wait.h>

#define  
    LISTEN_PORT    6000            //!> 端口
#define       MAX                                                    //!> 最大的等待请求数目

void str_echo( int sockfd)                                //!> 从client中读取数据
{
      ssize_t            n;
      charline[512];
     
      printf("准备读数据:");
     
      while( 1)
      {
            while( ( n =read( sockfd, line, 512 ) ) > 0)            //!> 注意是:根据accept得到的client的操作描述符来处理的呗~
            {
                  line[n] ='\0';
                  printf("Client  send: %s\n", line );
                  bzero(&line, sizeof( line ));            //!> 再次置NULL
            }
      }
}

int main( int argc, char ** argv )
{
      int                        listenfd,connfd;            //!> 描述符
      pid_t                  childpid;                        //!> 子进程号
      socklen_t            chilen;                              //!>
     
      structsockaddr_in chiaddr, servaddr;
     
      //!> 建立socket( TCP )
      //!>
      if( (listenfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
      {
            printf("socket error... :  %s\n",(char*)strerror(errno));
            exit(EXIT_FAILURE );
      }
     
      //!> socket参数
      //!>
      servaddr.sin_family =AF_INET;                                    //!> 协议族
      servaddr.sin_port = htons( LISTEN_PORT);            //!> IP
      servaddr.sin_addr.s_addr =INADDR_ANY;            //!> 本机IP
      bzero(&( servaddr.sin_zero ), 8);                              //!> 8字节填充字符

      //!> 绑定IP和端口
      //!>
      if( bind(listenfd, ( struct sockaddr * )&servaddr, sizeof(servaddr ) ) == -1 )
      {
            printf("bind失败\n");
            exit(EXIT_FAILURE );
      }

      //!> 下面开始监听
      //!>     
      if( listen(listenfd, MAX ) == -1 )
      {
            printf("listen error...");
            exit(EXIT_FAILURE );
      }
     
      while( 1)
      {
            chilen =sizeof( chiaddr );
           
            //!> 等待连接
            //!>
            if( ( connfd= accept( listenfd, ( struct sockaddr* )&chiaddr,&chilen ) ) == -1 )
            {
                  printf("accept error...\n");
                  exit(EXIT_FAILURE );
            }
            else
            {
                  printf("client连接成功!\n");
                     
           
            //!> 创建子进程来处理请求
            //!>
            if( (childpid = fork() ) == 0 )
            {
                  close(listenfd );                        //!> server关闭与其链接,交给子进程处理
                  printf("Client from %s\n", inet_ntoa( chiaddr.sin_addr ));
                  str_echo(connfd );
                  exit(EXIT_SUCCESS );
            }
            else if(childpid < 0 )
            {
                  printf("forkerror...\n");
                  close(connfd );
                  exit(EXIT_FAILURE );
            }
           
            close(connfd );
      }
     
      return0;
}


client.c

#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<strings.h>
#include<string.h>
#include<arpa/inet.h>
#include<errno.h>

#define       SERVER_PORT      6000

void str_cli( char * data, int sockfd)                        //!> 此处是client发送消息而已
   
      while( 1)
      {
            write(sockfd, data, strlen( data ) );
            sleep( 1);
      }
     
      exit( 0);
}

int main( int argc, char ** argv )
{
      intsockfd;
      structsockaddr_in servaddr;
     
      if( argc !=3 )
      {
            printf("输入参数!\n");
            exit(EXIT_FAILURE );
      }
     
      if( ( sockfd= socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
      {
            printf("socket error...\n");
            exit(EXIT_FAILURE );
      }
     
      bzero(&servaddr, sizeof( servaddr ) );
      servaddr.sin_family = AF_INET;
      servaddr.sin_port = htons( SERVER_PORT );
      inet_pton(AF_INET, argv[1], &servaddr.sin_addr);            //!> 需要自己写入IP 作为第一个参数

      printf("Client connecting...\n");
     
      if( connect(sockfd, ( struct sockaddr * )&servaddr, sizeof(servaddr ) ) == -1 )
      {
            printf("connect error..\n");
            exit(EXIT_FAILURE );
      }
     
      printf("开始发送data:\n");
      str_cli(argv[2], sockfd );

      return0;
}


makefile:

all: server client

server:
      gcc -W-o  server server.c
     
     
client:     
      gcc  -W -o client client.c
     
     
clean:
      rm -f serverclient

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值