TCP长短连接的通信

根据网上各位大佬的资源,加上个人修改完成的一些简单的文件与字符串多端通信,分享一下。tcp长短连接的多客户端通信,还有UDP的单波组播广播代码会在后续贴出。

tcp短连接server.c:

/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3333
#define BACKLOG 10
#define MAXDATASIZE 100

int main(void)
{
    struct sockaddr_in server_sockaddr, client_sockaddr ;
    int sin_size=0; 
    int recvbytes=0;
    int sockfd=0;
    int client_fd=0;
    char buf [MAXDATASIZE]={0};

    /*建立socket连接*/
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror ("socket") ;
        exit(1) ;
    }
    printf ("socket success!,sockfd=%d\n", sockfd);

    /*设置sockaddr in结构体中相关参数*/
    server_sockaddr.sin_family=AF_INET ;
    server_sockaddr.sin_port=htons(SERVPORT);
    server_sockaddr.sin_addr.s_addr=INADDR_ANY ;
    bzero(&(server_sockaddr.sin_zero) ,8);

    /*绑定函数bind*/
    if (bind(sockfd, (struct sockaddr*) &server_sockaddr ,sizeof (struct sockaddr))==-1)
    {
        perror ("bind") ;
        exit(1) ;
    }
    printf ("bind success! \n") ;

    /*调用listen函数*/
    if (listen(sockfd , BACKLOG)==-1)
    {
        perror ("listen") ;
        exit(1) ;
    }
    printf ("listening.....\n");

    /*调用accept函数,等待客户端的连接*/
    if((client_fd=accept(sockfd, (struct sockaddr*)&client_sockaddr,&sin_size))==-1)
    {
        perror ("accept") ;
        exit(1) ;
    }

    /*调用recv函数接收客户端的请求*/
    if ( (recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1)
    {
        perror ("recv") ;
        exit(1) ;
    }
    printf ("received a connection :%s\n",buf) ;

    /*将获取的字符串回传给客户端*/
    send(client_fd,buf,100,0);
    printf("成功回传 :%s\n",buf) ;
    close (sockfd) ;
    return 0;
}

tcp短连接client.c:

/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
main(int argc,char *argv[])
{
    int sockfd=0;
    int sendbytes=0;
    struct hostent *host;
    struct sockaddr_in serv_addr;
    char recv_buf[100]={0};
    char send_buf[100]={0};

    if(argc < 2)
    {
        fprintf (stderr, "Please enter the server's hostname! n") ;
        exit(1) ;
    }

    /*地址解析函数*/
    if ((host=gethostbyname (argv[1]))== NULL)
    {
        perror("gethostbyname");
        exit(1);
    }

    /*创建 socket*/
    if ((sockfd=socket(AF_INET , SOCK_STREAM,0))== -1)
    {
        perror("socket");
        exit(1);
    }

    /*设置sockaddr in结构体中相关参数*/
    serv_addr.sin_family=AF_INET ;
    serv_addr.sin_port=htons(SERVPORT) ;
    serv_addr.sin_addr=*((struct in_addr *)host->h_addr) ;
    bzero(&(serv_addr.sin_zero),8);

    /*调用connect函数主动发起对服务器端的连接*/
    if (connect (sockfd,(struct sockaddr *) &serv_addr,sizeof (struct sockaddr))== -1)
    {
        perror (" connect") ;
        exit(1) ;
    }

    /*发送消息给服务器端*/
    printf("input your message:");
    gets(send_buf);

    if((sendbytes=send (sockfd,send_buf,100,0))==-1)
    {
        perror("send");
        exit(1);
    }

    recv(sockfd, recv_buf, 100, 0);
    printf ("received 回复 :%s\n",recv_buf) ;
    close(sockfd);
    return 0;
}

tcp长连接server.c:

/*server1.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3344
#define BACKLOG 10
#define MAXDATASIZE 100
#define BUF_SIZE 1024

int main(void)
{
    struct sockaddr_in server_sockaddr, client_sockaddr ;
    int sin_size=0;
    int recvbytes=0;
    int sockfd=0;
    int client_fd=0;
    char buf [100]={0};
    char send_buf [BUF_SIZE]={0};
    char filename[100]={0};
    char ch={0};
    FILE *fp=NULL;

    /*建立socket连接*/
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror ("socket") ;
        exit(1) ;
    }
    printf ("socket success!,sockfd=%d\n", sockfd);

    /*设置sockaddr in结构体中相关参数*/
    server_sockaddr.sin_family=AF_INET ;
    server_sockaddr.sin_port=htons(SERVPORT);
    server_sockaddr.sin_addr.s_addr=INADDR_ANY ;
    bzero(&(server_sockaddr.sin_zero) ,8);

    /*绑定函数bind*/
    if (bind(sockfd, (struct sockaddr*) &server_sockaddr ,sizeof (struct sockaddr))==-1)
    {
        perror ("bind") ;
        exit(1) ;
    }
    printf ("bind success! \n") ;

    /*调用listen函数*/
    if (listen(sockfd , BACKLOG)==-1)
    {
        perror ("listen") ;
        exit(1) ;
    }
    printf ("listening.....\n");

    /*调用accept函数,等待客户端的连接*/
    if((client_fd=accept(sockfd, (struct sockaddr*)&client_sockaddr,&sin_size))==-1)
    {
        perror ("accept") ;
        exit(1) ;
    }

    /*调用recv函数接收客户端的请求*/
    if ( (recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1)
    {
        perror ("recv") ;
        exit(1) ;
    }
    printf ("received a connection :%s\n",buf) ;

    /*将获取的字符串回传给客户端*/
    send(client_fd,buf,5,0);
    printf("成功回传 :%s\n",buf) ;

    while(1)
    {
        printf("filename:");
        gets(filename);
        fp = fopen (filename,"rb");

        if(fp == NULL)
        {
            printf("Cannot open file!\n");
            continue;
        }

        send(client_fd,filename,100,0);
        printf("开始发送%s\n",filename);

        int nCount=0;
        int fr=0;

        while(!feof(fp))
        {
            nCount = fread(send_buf, 1, BUF_SIZE, fp);
            fr=send(client_fd, send_buf, nCount, 0);
            printf("##############%d##############\n",fr);

            if(fr!=nCount)
            {
                printf("发送失败,重新发送");
                break;
            }

            //printf("%s",send_buf);
            memset(send_buf, 0, sizeof (send_buf));
        }

        fclose(fp);
        printf("发送%s成功\n",filename) ;    

        for (unsigned int i = 0; i < strlen(filename); i++)
        {
            filename[i] = '\0' ;
        }

        sleep(1);
    }
    return 0;
}

tcp长连接client.c:

/*client1.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3344
#define BUF_SIZE 1024

main(int argc,char *argv[])
{
    int sockfd=0;
    int sendbytes=0;
    struct hostent *host;
    struct sockaddr_in serv_addr;
    char rev_buf[BUF_SIZE]={0};
    char ch[100]={0};
    char f_buf[]="\final";
    int server_fd=0;

    if(argc < 2)
    {
        fprintf (stderr, "Please enter the server's hostname! n") ;
        exit(1) ;
    }

    /*地址解析函数*/
    if ((host=gethostbyname (argv[1]))== NULL)
    {
        perror("gethostbyname");
        exit(1);
    }

    /*创建 socket*/
    if ((sockfd=socket(AF_INET , SOCK_STREAM,0))== -1)
    {
        perror("socket");
        exit(1);
    }

    /*设置sockaddr in结构体中相关参数*/
    serv_addr.sin_family=AF_INET ;
    serv_addr.sin_port=htons(SERVPORT) ;
    serv_addr.sin_addr=*((struct in_addr *)host->h_addr) ;
    bzero(&(serv_addr.sin_zero),8);

    /*调用connect函数主动发起对服务器端的连接*/
    if ((server_fd=connect (sockfd,(struct sockaddr *) &serv_addr,sizeof (struct sockaddr)))== -1)
    {
        perror (" connect") ;
        exit(1) ;
    }

    /*发送消息给服务器端*/
    if((sendbytes=send (sockfd,"hello",5,0))==-1)
    {
        perror("send");
        exit(1);
    }

    recv(sockfd, rev_buf, 100, 0);
    printf ("收到信息:%s\n",rev_buf) ;

    char rv_buf[BUF_SIZE]={0};
    char send_buf[BUF_SIZE]={0};
    char filename[100]={0};
    FILE *fp=NULL;
    int flag=0;

    while(1)
    {
        flag=recv(sockfd, filename, 100, 0);
        //printf("%d",flag);

        if (flag>0)
        {
            fp = fopen(filename, "w");
            printf("开始接收:%s\n", filename);

            int nCount = 1024;
            int fw=0;

            while (nCount == 1024)
            {
                nCount = recv(sockfd, rv_buf, BUF_SIZE, 0);
                fw=fwrite(rv_buf, 1, nCount, fp);

                if(fw!=nCount)
                {
                    printf("write error");
                    exit(-1);
                }
                printf("##############%d##############\n",nCount);
                //printf("%s",rv_buf);
                for (unsigned int i = 0; i < strlen(rv_buf); i++)
                {
                    rv_buf[i] = '\0' ;
                }
            }

            printf("接收成功:%s\n", filename);
            fclose(fp);
            fp=NULL;
            flag=0;
            printf("%d",flag);

            for (unsigned int i = 0; i < strlen(filename); i++)
            {
                filename[i] = '\0' ;
            }
            //printf("清除:%s\n", filename);

            sleep(1);
        }
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值