TCP多线程:服务器端接收不到客户端发来的信息求大佬帮忙

这篇文章详细描述了一个使用C语言编写的服务器程序,通过socket编程处理客户端连接,包括创建socket、绑定、监听、接受连接以及客户端数据处理。同时,还展示了客户端如何连接到服务器并进行数据交换。
摘要由CSDN通过智能技术生成

server.c

#include<stdio.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<errno.h>

#include<string.h>

#include<stdlib.h>

#include<unistd.h>

#include<netinet/in.h>

#include<netinet/ip.h>

#include <arpa/inet.h>

#include<pthread.h>

#define SERV_PORT 5001


 

struct cli_msg

{

    int newfd;

    struct sockaddr_in cin;

};

void cli_data_handle(void *arg);

int main()

{

    int fd = -1;

    struct sockaddr_in sin;

    /*创建socket*/

    if((fd = socket(AF_INET,SOCK_STREAM,0)) < 0)

    {

        perror("socket");

        exit(1);

    }

    int b_reuse = 1;

    setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&b_reuse,sizeof(int));

    /*绑定*/

    /*填充struct sockaddr_in*/

    bzero(&sin,sizeof(sin));

    sin.sin_family = AF_INET;

    sin.sin_port = htons(SERV_PORT);//网络字节序的端口号

    sin.sin_addr.s_addr = INADDR_ANY;

   

    /*绑定*/

    if(bind(fd,(struct sockaddr *)&sin,sizeof(sin)) < 0)

    {

        perror("bind");

        exit(1);

    }

    /*调用listen()把主动套接字变成被动套接字*/

    if(listen(fd,5) < 0)

    {

        perror("listen");

        exit(1);

    }

    printf("Server starting ok\n");

    int newfd = -1;

    struct sockaddr_in cin;

    socklen_t addrlen = sizeof(cin);

    pthread_t tid;

    while (1)

    {

            /*阻塞等待客户端连接请求*/

        if(newfd = accept(fd,(struct sockaddr *)&cin,&addrlen) < 0)

        {

            perror("accept");

            exit(1);

        }

        /*获取刚建立连接的socket的客户端的ip地址和端口*/

        char ipv4_addr[16];

        if(!inet_ntop(AF_INET,(void *)&cin.sin_addr.s_addr,ipv4_addr,sizeof(cin)))

        {

            perror("inet_ntop");

            exit(1);

        }

        printf("Client(%s:%d) is connected\n",ipv4_addr,htons(cin.sin_port));

        pthread_create(&tid,NULL,(void *)cli_data_handle,(void *)&newfd);

    }

    close(fd);

    return 0;

}


 

void cli_data_handle(void * arg)

{

    int newfd = *(int *)arg;

    printf("handler pthread: newfd = %d\n",newfd);

    /*读写*/

    int res = -1;

    char buf[BUFSIZ];

    while (1)

    {

        bzero(buf,BUFSIZ);

        do

        {

            res = read(newfd,buf,BUFSIZ-1);

        } while (res < 0 && EINTR == errno);

        if(res < 0)

        {

            perror("read");

            exit(1);

        }

        if(!res)//对方已关闭

        {

            break;

        }

        printf("Recv data: %s\n",buf);

        if(strcmp(buf,"q\n") == 0)//用户输入了q字符退出

        {

            printf("Client(fd = %d) is exiting\n",newfd);

            break;

        }

       

    }

    close(newfd);

}

client.c

#include<stdio.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<errno.h>

#include<string.h>

#include<stdlib.h>

#include<unistd.h>

#include<netinet/in.h>

#include<netinet/ip.h>

#include <arpa/inet.h>

#include<pthread.h>

#define SERV_PORT 5001

void usage(char *s)

{

    printf("\n%s serv_ip serv_port",s);

    printf("\n\t serv_ip: server ip address");

    printf("\n\t serv_port: server port(>5000)\n\n");

}

int main(int argc,char **argv)

{

    struct sockaddr_in sin;

    int fd = -1;

    int port = -1;

    int res;

    if(argc != 3)

    {

        usage(argv[0]);

        exit(1);

    }

    /*创建socket*/

    if((fd = socket(AF_INET,SOCK_STREAM,0)) < 0)

    {

        perror("socket");

        exit(1);

    }

    port = atoi(argv[2]);

    if(port < 5000)

    {

        usage(argv[0]);

        exit(1);

    }

    /*连接服务器*/

    /*绑定*/

    /*填充struct sockaddr_in*/

    bzero(&sin,sizeof(sin));

    sin.sin_family = AF_INET;

    sin.sin_port = htons(port);//网络字节序的端口号

    //sin.sin_addr.s_addr = inet(SERV_IP_ADDR);

    if(inet_pton(AF_INET,argv[1],(void *)&sin.sin_addr.s_addr) != 1)

    {

        perror("inet_pton");

        exit(1);

    }

    if(connect(fd,(struct sockaddr *)&sin,sizeof(sin)) < 0)

    {

        perror("connect");

        exit(1);

    }

    /*读写*/

    char buf[BUFSIZ];

    while (1)

    {

        bzero(buf,BUFSIZ);

        if(fgets(buf,BUFSIZ-1,stdin) == NULL)

        {

            continue;

        }

        if((res = write(fd,buf,strlen(buf))) == -1)

        {

            perror("write");

            exit(1);

        }

        if(strcmp(buf,"q\n") == 0)//用户输入了q字符退出

        {

            printf("Client is exiting\n");

            break;

        }

    }

    close(fd);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值