C语言简单服务端(记录服务流程)

Makefile文件
CC = gcc
CPFLAGS = 

TARGET = server.exe
OJBS = test.c

all:$(TARGET)

run:all
	.\$(TARGET)

$(TARGET):$(OJBS)
	$(CC) $(CPFLAGS) -o $@ $^

.PTHONY=clean
clean:
	rm -f $(TARGET)
server.c文件
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>
#include <fcntl.h>

const int server_port=6800;
struct s_info         // 定义client信息结构体
{
    struct sockaddr_in client_addr;
    int cli_fd;
}s[10];

//   处理client请求,将收到的字符串返回
void * client_tackle(void * arg)
{
    struct s_info * arg_cli=(struct s_info *)arg;
    char buff[1024]={0},buff_s[1028]={0};
    write(arg_cli->cli_fd,"socket established.\n",sizeof("socket established.\n"));

    while(1)
    {
        int read_num=read(arg_cli->cli_fd,buff,sizeof(buff));
        if(read_num==0)
        {
            printf("%s:%d socket stream closed\n",
                inet_ntoa(arg_cli->client_addr.sin_addr),ntohs(arg_cli->client_addr.sin_port));
            fflush(stdout);
            break;
        }
        else
        {
            write(arg_cli->cli_fd,buff,strlen(buff) );
            printf("%s",buff);
            fflush(stdout);
            bzero(buff,sizeof(buff));
        }
    }

    close(arg_cli->cli_fd);
}

int main(int argc,char *argv[])
{
    int sfd,cfd,n,i=0;
    pthread_t pid;    // 线程号
    struct sockaddr_in ser_addr,cli_addr;
    bzero(&cli_addr,sizeof(cli_addr));   //   置零client地址
    //  填充server地址
    ser_addr.sin_family=AF_INET;
    ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    ser_addr.sin_port=htons(server_port);
    socklen_t cli_addr_len;

    sfd=socket(AF_INET,SOCK_STREAM,0);    // 建立socket
    setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&n,4);

    int ret=bind(sfd,(const struct sockaddr *)&ser_addr,sizeof(ser_addr));   //  绑定socket
    if(ret<0)
    {
        perror("bind error:");
    }

    listen(sfd,5);      // 监听
    printf("waiting for connect.\n");
    fflush(stdout);
	
	//  对收到的请求进行处理
    while(1)
    {
        cfd=accept(sfd,(struct sockaddr *)&cli_addr,&cli_addr_len);    //  接受请求
        s[i].cli_fd=cfd;
        s[i].client_addr=cli_addr;

        printf("%s:%d request to connect.\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
        fflush(stdout);

        pthread_create(&pid,NULL,client_tackle,(void *)&s[i]);      // 创建线程处理请求
        pthread_detach(pid);     // 线程后台运行

        i++;
        if(i==10)
        {
            i=0;
        }
    }

    close(sfd);

    return 0;
}

可以用netcat工具进行测试。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值