socket通信

socket server:
int main(int argc, char* argv[]) {
    int sockfd, connfd;
    
    if ((sockfd  = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        perror("socket create error!");
        exit(-1);
    }
    
    int reuse = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
    
    struct sockaddr_in serverAddr;
    bzero(&serverAddr, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = INADDR_ANY; //inet_addr(OPEN_HOST);
    
    if (bind(sockfd , (struct sockaddr*) &serverAddr, sizeof(serverAddr)) != 0){
        perror("bind error!");
        close(sockfd);        
        exit(-1);
    }

    if (listen(sockfd , BACKLOG) != 0){
        perror("listen error!");
        close(sockfd);        
        exit(-1);
    }
    
    signal(SIGALRM, colseSockTimeout);
    
    while (1) {
        struct sockaddr_in clientAddr;
        int clientAddrLen = sizeof(clientAddr);
        if((connfd = accept(sockfd , (struct sockaddr*) &clientAddr, &clientAddrLen)) < 0){
            perror("accept error!");
            continue;
        }
        
        char * childAddr = (char *)inet_ntoa(clientAddr.sin_addr);
        int childPort = htons(clientAddr.sin_port);
        //printf("Client %d (IP:%s/PORT:%d) is connected!\n", connfd, childAddr, childPort);
        
        signal(SIGCHLD, SIG_IGN);
        pid_t pid = fork();
        
        if (pid == 0) {
            char recvMsg[MAXDATASIZE];
            char sendMsg[MAXDATASIZE];
            char buff[MAXDATASIZE];
            
            close(sockfd);
            
            while(1) {
                temp_connfd = connfd;
                alarm(SOCK_TIMEOUT);
                bzero(recvMsg, sizeof(recvMsg));
                if (recv(connfd, recvMsg, sizeof(recvMsg), 0) <= 0) {
                    //printf("Client %d (IP:%s/PORT:%d) closed!\n", connfd, childAddr, childPort);
                    close(connfd);
                    exit(0);
                }
                alarm(0);
                
                bzero(buff, sizeof(buff));
                removeWrap(recvMsg, buff);

                sprintf(sendMsg, "Message: %s, send successed!\r\n", buff);
                printf("Client %d (IP:%s/PORT:%d) say:%s\r\n", connfd, childAddr, childPort, buff);
                printf("Server say:%s\n", sendMsg);
                send(connfd, sendMsg, strlen(sendMsg), 0);
                close(connfd);
            }
        } else if(pid > 0) {
            close(connfd);
        } else {
            perror("fork error!");
            exit(-1);
        }
    }
    close(sockfd);
    return 0;
}

 

socket client:

int main(int argc, char* argv[]) {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in serveraddr;
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(PORT);
    serveraddr.sin_addr.s_addr = inet_addr(LOACL_HOST);
    connect(sockfd, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
    while(1){
        char buf[MAXDATASIZE];
        char sendMsg[MAXDATASIZE];
        bzero(buf, sizeof(buf));
        printf("input:");
        fgets(buf, sizeof(buf), stdin);
        send(sockfd, buf, sizeof(buf), 0);
        bzero(buf, sizeof(buf));
        recv(sockfd, buf, sizeof(buf), 0);
        fputs(buf, stdout);
    }
    close(sockfd);
    return 0;    
}
 

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