UNP——TCP回射服務器

非阻塞connect
server

#include <stdio.h>
#include <stdlib.h>
#include "tcpser.h"
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/select.h>
#include <errno.h>


#define LISTSIZE 50
//#define MAX(a,b)((a)>(b)? (a):(b))
#define ADDRBUFFER 50
#define RECV_BUFSIZE 1024
int main()
{
    fd_set* r_set,w_set,e_set;
    int sd,wd;
    int nsd;
    ssize_t num;
    int flag;
    char recv_buffer[RECV_BUFSIZE];
    char addr_buffer[ADDRBUFFER];
    struct sockaddr_in laddr, raddr;
    struct timeval timel;
    timel.tv_sec = 60;
    int raddr_size = sizeof(raddr);
    // fp = fopen();
    // int fd = fileno(fp);
    sd = socket(AF_INET,SOCK_STREAM,0);
    if(sd<0)
    {
        perror("socket");
        exit(1);          
    }
    if(setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(flag))<0)
    {
        perror("setsockopt");
        exit(1);             
    }
    laddr.sin_family = AF_INET;
    laddr.sin_port = htons(PORT);
    inet_pton(AF_INET,"0.0.0.0",(void*)&laddr.sin_addr);
    if(bind(sd,(void*)&laddr,sizeof(laddr))<0)
    {
        perror("bind");
        exit(1);
    }
    if(listen(sd,LISTSIZE)<0)
    {
        perror("listen");
        exit(1);        
    }

    while(1)
    {

        FD_ZERO(r_set);
        //FD_ZERO(w_set);
        FD_SET(sd,r_set);
        //FD_SET(fd,w_set);
        
        switch(select(sd+1,r_set,NULL,NULL,&timel))
        {   
            case 0:
            {
                fprintf(stdout,"timeout\n");
                break;
            }
            case -1:
            {
                if(errno == EINTR)
                    continue;  
                else
                {
                    perror("select");
                    break;
                } 
            }
            default:
            {
                if(FD_ISSET(sd,r_set))
                {
                    nsd = accept(sd,(void*)&raddr,(void*)&raddr_size);
                    if( nsd < 0)
                    {
                        perror("accept");
                        exit(1);
                    }    
                    inet_ntop(AF_INET,(void*)&raddr.sin_addr,addr_buffer,ADDRBUFFER);
                    printf("the client ip is %s, port is %d\n",addr_buffer,ntohs(raddr.sin_port));
                    while(1)
                    {
                        num = recv(nsd,recv_buffer,RECV_BUFSIZE,0);
                        if(num == 0)
                        {
                            printf("end \n");
                            break;
                        }
                        else if(num<0)
                        {
                            perror("recv");
                            exit(1);
                        }
                        if(write(nsd,recv_buffer,num)<0)
                        {
                            perror("write");
                            exit(1);
                        }
                    }
                    close(nsd);
                }
            }
        }

    }
    
    close(sd);
    exit(0);

}


client

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <string.h>
#include <strings.h>
#include "tcpser.h"

#define MAXLINE 1024

int main(int argc, char* argv[])
{
    int sockfd;
    int n;
    struct sockaddr_in servaddr;
    char buf[MAXLINE];
    fd_set rset;
    int maxfd;
    int stdineof;

    if(argc != 2){
        printf("invalid usage!\n");
        exit(1);
    }

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        perror("socket");
        exit(1);
    }

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    inet_pton(AF_INET,  argv[1], &servaddr.sin_addr);

    if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
        perror("socket");
        exit(1);
    }

    maxfd = sockfd;
    FD_ZERO(&rset);
    stdineof = 0;

    while(1){
        if(stdineof == 0)
            FD_SET(0, &rset);
        FD_SET(sockfd, &rset);

        if((n = select(maxfd+1, &rset, NULL, NULL, NULL)) < 0){
            printf("select error\n");
            exit(1);
        }

        if(FD_ISSET(0, &rset)){
            if((n = read(0, buf, MAXLINE)) == 1){
                printf("shutdown ready\n");
                stdineof = 1;
                if(shutdown(sockfd, SHUT_RD) < 0){
                    perror("shutdown");
                    exit(1);
                }
                FD_CLR(0, &rset);
                continue;
            }
            else if(n < 0){
                perror("read");
                exit(1);
            }
            if((n = write(sockfd, buf, n)) < 0){
                perror("write");
                exit(1);
            }
        }

        if(FD_ISSET(sockfd, &rset)){
            if((n = read(sockfd, buf, MAXLINE)) == 0){
                if(stdineof == 1)
                    break;
                else{
                    printf("server terminated\n");
                    exit(1);
                }
            }
            else if(n < 0){
                perror("read");
                exit(1);
            }
            if((n = write(1, buf, n)) < 0){
                perror("write");
                exit(1);
            }
        }
    }
    return 0;
}

h文件

#ifndef TCPSER_H_
#define TCPSER_H_

#define PORT 2010



#endif 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章