linux c语言socket编程实例(1server-nclient),一个服务器,多个客户端

服务器端代码:

/**************************************************
##filename      : server.c
##author        : GYZ                              
##e-mail        : [email protected]                
##create time   : 2018-07-23 10:41:42
##last modified : 2018-07-26 13:27:19
##description   : NA                               
**************************************************/

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

void pthread_func(int*);

int main(int argc,char *argv[])                    
{                                                  
    int server_sockfd;
    int client_sockfd;
    int ret;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    socklen_t server_addrlen;
    socklen_t client_addrlen;
    int on = 1;

    char buf[20];

    /*1,create a socket*/
    /*IPPROTO=0,dumserver protocol for TCP*/
    server_sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == server_sockfd)
    {
        perror("socket"),exit(-1);
    }
    /*1.5 enable address reuse*/
    ret = setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    /*2,bind the socket with an ip*/
    memset(&server_addr,0,sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(3490);
    server_addr.sin_addr.s_addr = inet_addr("172.23.7.179");
    server_addrlen = sizeof(struct sockaddr);
    ret = bind(server_sockfd,(const struct sockaddr*)&server_addr,server_addrlen);
    if(-1 == ret)
    {
        perror("bind"),exit(-1);
    }
    /*3,listen the socket*/
    ret = listen(server_sockfd,6);
    if(-1 == ret)
    {
        perror("listen"),exit(-1);
    }
    while(1)
    {
        /*4,accept the data from the client*/
        client_addrlen = sizeof(struct sockaddr);
        client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_addr,&client_addrlen);
        if(client_sockfd > 0)
        {    
            printf("IP is %s\n",inet_ntoa(client_addr.sin_addr));
            printf("Port is %d\n",ntohs(client_addr.sin_port));
            pthread_t pt;
            printf("%d\n",client_sockfd);
            ret = pthread_create(&pt,NULL,(void *)pthread_func,&client_sockfd);
            if(0 != ret)
            {
                printf("ip:%s connect failed",inet_ntoa(client_addr.sin_addr));
            }

           pthread_join(pt,(void*)buf);
        }
    }
    close(server_sockfd);
    return 0;                                      
}                                                  
void pthread_func(int* p_client_sockfd)            
{
    int client_sockfd = *p_client_sockfd;
    printf("%d\n",client_sockfd);
    int ret;
    char data[100];
    char data1[100];
    while(1)
    {
        /*5,read the data from client*/
        ret = recv(client_sockfd,data,100,0);
        if(-1 == ret)
        {
            perror("recv"),exit(-1);
        }
        printf("data from client:%s\n",data);
        /*6,send the data to client*/
        printf("server send data:");
        scanf("%s",data1);
        ret = send(client_sockfd,data1,100,0);
        if(-1 == ret)
        {
            perror("send"),exit(-1);
        }                                                  
    }
   pthread_exit(0);
}
客户端代码:

/**************************************************
##filename      : client.c
##author        : GYZ                              
##e-mail        : [email protected]                
##create time   : 2018-07-23 16:36:34
##last modified : 2018-07-26 13:14:36
##description   : NA                               
**************************************************/

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

int main(int argc,char *argv[])                    
{                                                  
    int client_sockfd;
    struct sockaddr_in client_addr;
    socklen_t client_addrlen;
    char data[20];
    char data1[20];
    int ret;

    /*1,create a socket*/
    client_sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == client_sockfd)
    {
        perror("socket"),exit(-1);
    }
    /*2,connect to the server*/
    memset(&client_addr,0,sizeof(struct sockaddr));
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(3490);
    client_addr.sin_addr.s_addr = inet_addr("172.23.7.179");
    client_addrlen = sizeof(struct sockaddr);
    ret = connect(client_sockfd,(const struct sockaddr *)&client_addr,client_addrlen);
    if(-1 == ret)
    {
        perror("connect"),exit(-1);
    }
    while(1)
    {
        /*3,send the data to server*/
        printf("client data are :");
        scanf("%s",data);
        ret = send(client_sockfd,data,20,0);
        if(-1 == ret)
        {
            perror("write"),exit(-1);
        }
        /*4,receive the data from server*/
        ret = recv(client_sockfd,data1,100,0);
        if(-1 == ret)
        {
            perror("recv"),exit(-1);
        }
        printf("data from server:%s\n",data1);
    }
    close(client_sockfd);
    return 0;                                      
}                                                  
                                                   

makefile文件:

all:server client

CC = gcc
SRC1 = server.c
SRC2 = client.c
OBJE1 = server
OBJE2 = client

${OBJE1}: 
    ${CC} ${SRC1} -o ${OBJE1} -pthread
${OBJE2}:
    ${CC} ${SRC2} -o ${OBJE2} -pthread 

.PHONY:clean
clean :
    rm ${OBJE1} ${OBJE2}
参考:https://blog.csdn.net/returningprodigal/article/details/51916754

这篇文章写的比较全,不过对初学者略复杂,我抽出主要部分,方便理解

说明:

1,pthread_create()函数是创建一个新线程;

2,pthread_exit()函数是终止该线程;

3,pthread_join()函数是回收结束线程的资源;

4,pthread_kill()函数传递信号,并非是杀死线程,第二个参数为0时,表示检查该线程是不是结束了。

                                      

猜你喜欢

转载自blog.csdn.net/weixin_39465823/article/details/81220176