一个简单的多线程socket

码了2个小时多,终于弄完了。用的编辑器是Qt creator ,突然发现在Qt creator上,也支持这些底层的c语言。在linux上调试无误。写这个,也算是自己读书的记录吧!

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>

#define PORT 1234
#define BACKLONG 100
#define MAXCHARSIZE 100

void process_client (int connectfd,struct sockaddr_in client);
void *start_routine(void *arg);

struct ARG{
    int connfd;
    struct sockaddr_in client;
};
struct ARG *arg;
int main(void)
{
    int listenfd,connectfd;
    int sin_size;
    int opt = SO_REUSEADDR;
    struct sockaddr_in server,client;
    pthread_t tid;
    sin_size = sizeof(struct sockaddr_in);
    if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        perror("Create socket failed");
        exit(-1);

    }
    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    bzero(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr= htonl(INADDR_ANY);
    if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1)
    {
        perror("bind error");
        exit(-1);
    }
    if(listen(listenfd,BACKLONG) == -1)
    {
        perror("listen error");
        exit(-1);   
    }
    while(1)
    {
        if((connectfd = accept(listenfd,(struct sockaddr*)&client,&sin_size)) == -1)
        {
            perror("Accept error");
            exit(-1);             
        }
        arg = (struct ARG *)malloc(sizeof (struct ARG));
        arg->connfd = connectfd;
        memcpy((void *)&arg->client,&client,sizeof(client));
        if(pthread_create(&tid,NULL,start_routine,(void *)arg))
        {
            perror("pthread_create error\n");
            exit(-1);
        }
        
    }
    close(listenfd);

}
void *start_routine(void *arg)
{
    struct ARG *info;
    info = (struct ARG *)arg;
    process_client(info->connfd,info->client);
    free(arg);
    pthread_exit(NULL);       
}
void process_client(int connectfd, struct sockaddr_in client)
{
    char recvbuf[MAXCHARSIZE];
    char sendbuf[MAXCHARSIZE];
    char client_name[MAXCHARSIZE];
    int recvlen,i;
    printf("you get a connetion from %s.",inet_ntoa(client.sin_addr));
    send(connectfd,"welcome to my server.\n",22,0);
    recvlen = recv(connectfd,client_name,MAXCHARSIZE,0);
    if(recvlen == 0)
    {
        close(connectfd);
        printf("client disconnetted \n");
        return;
    }
    else if(recvlen < 0)
    {
        close(connectfd);
        printf("connect broked.\n");
        return;
    }
    client_name[recvlen] = '\0';
    printf("client name is %s.\n",client_name);
    bzero(recvbuf,100);
    while(recvlen=recv(connectfd,recvbuf,MAXCHARSIZE,0))
    {
        recvbuf[recvlen] = '\0';
        printf("Receive clent (%s) message:%s\n",client_name,recvbuf);
        for(i = 0;i<recvbuf;i++);
        sendbuf[i] = recvbuf[recvlen - i -1];
        sendbuf[recvlen]= '\0';
        send(connectfd,sendbuf,strlen(sendbuf),0);
        bzero(recvbuf,100);        
    }
    printf("Client(%s) disconnected\n",client_name);
    close(connectfd);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值