简单的TCP 和 UDP 通信

声明:文章中内容部分参考网络资料。

============================TCP and UDP service=============================  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<errno.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<netinet/in.h>  

#define DEFAULT_PORT 8080  
#define MAXLINE 4096  
#define BACKLOG 10
#define BUF_SIZE 200

int main(int argc, char** argv)  
{  
    int    socket_fd, new_fd;
    struct sockaddr_in    servaddr;
    struct sockaddr_in    client_addr;  

    char    buf[4096];  
    int    i;  

    int err,sock_reuse=1;
    
    int fd_A[BACKLOG] = {0};

    fd_set fdsr;
    int maxsock;  
    struct timeval tv;
    int  conn_amount = 0;
    socklen_t sin_size;

    if(argc < 2)
    {
        printf("input param is too few \n");
        return -1;
    }
    if((strstr(argv[1],"TCP")==NULL)&&(strstr(argv[1],"UDP")==NULL))
    {
        printf("the type is error\n");
        return -1;
    }

    //TCP operator
    if(!strcmp(argv[1],"TCP"))
    {
        //init Socket  
        if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
        {  
            perror("create socket error:");
            return -1;
        }  
        
        err=setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&sock_reuse,sizeof(sock_reuse));
        if(err!=0)
        {
            perror("set setsocketopt error:");
            return -1;
        }

        //init service addr
        memset(&servaddr, 0, sizeof(servaddr));  
        servaddr.sin_family = AF_INET;  
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPµØÖ•ÉèÖóÉINADDR_ANY,ÈÃϵͳ×Ô¶¯»ñÈ¡±¾»úµÄIPµØÖ•¡£  
        servaddr.sin_port = htons(DEFAULT_PORT);//ÉèÖõĶ˿ÚΪDEFAULT_PORT  

        //bind service addr in socket
        if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
        {  
            perror("bind socket error:");  
            return -1;  
        }  
        
        //listen client
        if( listen(socket_fd, BACKLOG) == -1)
        {  
            printf("listen socket error: ");  
            return -1;  
        }  
        
        printf("======waiting for client's request======\n");  


        sin_size = sizeof(client_addr);
        maxsock = socket_fd;  
        
        while(1)
        {
            FD_ZERO(&fdsr);  
            FD_SET(socket_fd, &fdsr);  

            // timeout setting  
            tv.tv_sec = 30;  
            tv.tv_usec = 0;  

            // add active connection to fd set  
            for (i = 0; i < BACKLOG; i++)
            {  
                if (fd_A[i] != 0)
                {  
                      FD_SET(fd_A[i], &fdsr);  
                }  
            }  

            err = select(maxsock + 1, &fdsr, NULL, NULL,NULL);  
            if (err < 0)
            {  
                perror("select");  
                break;  
            }
            else if (err == 0)
            {  
                printf("timeout\n");  
                continue;  
            }  

            // check every fd in the set  
            for (i = 0; i < conn_amount; i++)
            {  
                if (FD_ISSET(fd_A[i], &fdsr))
                {  
                        err = recv(fd_A[i], buf, sizeof(buf), 0);  
                  
                        char str[] = "Good,very nice!\n";  
                  
                        send(fd_A[i],str,sizeof(str) + 1, 0);  
                  
                  
                        if (err <= 0)
                    {        // client close  
                            printf("client[%d] close\n", i);  
                            close(fd_A[i]);  
                            FD_CLR(fd_A[i], &fdsr);  
                            fd_A[i] = 0;  
                        }
                    else
                    {        // receive data  
                            if (err < BUF_SIZE)  
                            memset(&buf[err], '\0', 1);  
                            printf("client[%d] send:%s\n", i, buf);  
                        }  
                }  
            }  
      
             // check whether a new connection comes  
            if (FD_ISSET(socket_fd, &fdsr))
            {
                new_fd = accept(socket_fd, (struct sockaddr *)&client_addr, &sin_size);
                if (new_fd <= 0)
                {  
                       perror("accept");  
                       continue;  
                    }  

                // add to fd queue
                if (conn_amount < BACKLOG)
                {
                    fd_A[conn_amount++] = new_fd;
                    printf("new connection client[%d] %s:%d\n", conn_amount,\
                        inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));  
                        if (new_fd > maxsock)  
                               maxsock = new_fd;  
                }  
                else
                {
                    printf("max connections arrive, exit\n");
                    send(new_fd, "bye", 4, 0);
                    close(new_fd);
                    break;
                }
            }  
        }  

        // close other connections  
        for (i = 0; i < BACKLOG; i++)
        {
            if (fd_A[i] != 0)
            {
                close(fd_A[i]);  
            }  
        }  
    }
    else
    {
        printf("---------UDP service \n");
        if( (socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 )
        {  
            perror("create socket error:");
            return -1;
        }  
        
        memset(&servaddr, 0, sizeof(servaddr));  
        servaddr.sin_family = AF_INET;  
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPµØÖ•ÉèÖóÉINADDR_ANY,ÈÃϵͳ×Ô¶¯»ñÈ¡±¾»úµÄIPµØÖ•¡£  
        servaddr.sin_port = htons(DEFAULT_PORT);//ÉèÖõĶ˿ÚΪDEFAULT_PORT  

        //bind service addr in socket
        if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
        {  
            perror("bind socket error:");  
            return -1;  
        }
        
        sin_size = sizeof(client_addr);
        while(1)
            {
                 /* waiting for receive data */
                 err = recvfrom(socket_fd, buf, sizeof(buf), 0,  (struct sockaddr *)&client_addr, &sin_size);
            printf("msg from %s \n",inet_ntoa(servaddr.sin_addr));
            printf("recv is %s \n",buf);
                 /* sent data back to client */
                 sendto(socket_fd, "ok nice", sizeof("ok nice"), 0,  (struct sockaddr *)&client_addr, sin_size);
            }        
    }
    return 0;  

}  
 =======================TCP and UDP client============================
/* File Name: client.c */  
 
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<errno.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<netinet/in.h>  
 
#define MAXLINE 4096  
 
int main(int argc, char** argv)  
{  
    int    sockfd, n,rec_len;  
    char    recvline[4096], sendline[4096];  
    char    buf[MAXLINE];  
    struct sockaddr_in    servaddr;  

    if(argc < 3)
    {
        printf("input param is too few \n");
        return -1;
    }
    if((strstr(argv[1],"TCP")==NULL)&&(strstr(argv[1],"UDP")==NULL))
    {
        printf("the type is error\n");
        return -1;
    }

    if(!strcmp(argv[1],"TCP"))
    {
        if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {  
            printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);  
            exit(0);  
        }  


        memset(&servaddr, 0, sizeof(servaddr));  
        servaddr.sin_family = AF_INET;  
        servaddr.sin_port = htons(8080);  
        if( inet_pton(AF_INET, argv[2], &servaddr.sin_addr) <= 0)
        {  
            printf("inet_pton error for %s\n",argv[2]);  
            exit(0);  
        }  


        if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
        {  
            printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  
            exit(0);  
        }  


        printf("send msg to server: \n");  
        fgets(sendline, 4096, stdin);  
        if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
        {  
            printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
            exit(0);  
        }  
        if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1)
        {  
            perror("recv error");  
            exit(1);  
        }  
        buf[rec_len]  = '\0';  
        printf("Received : %s ",buf);  
        close(sockfd);  
        exit(0);  
    }
    else
    {
        if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {  
            printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);  
            exit(0);  
        }  


        memset(&servaddr, 0, sizeof(servaddr));  
        servaddr.sin_family = AF_INET;  
        servaddr.sin_port = htons(8080);  
        if( inet_pton(AF_INET, argv[2], &servaddr.sin_addr) <= 0)
        {  
            printf("inet_pton error for %s\n",argv[2]);  
            exit(0);  
        }  


        if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
        {  
            printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  
            exit(0);  
        }  
        
        printf("send msg to server: \n");  
        fgets(sendline, 4096, stdin);  
        if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
        {  
            printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
            exit(0);  
        }  
        if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1)
        {  
            perror("recv error");  
            exit(1);  
        }  
        buf[rec_len]  = '\0';  
        printf("Received : %s ",buf);  
        close(sockfd);  
        exit(0);  

    }
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值