套接字通信程序示例,通信域为PF_INET,服务器端

时间 : 16-01-26 栏目 : linux编程 作者 : 老薛 评论 : 0 点击 : 1,844 次

#include <stdio.h>
#include <stdlib.h>/*for  atoi()*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
#include <ctype.h>/*for toupper()*/

void sig_handler(int signo)
{
    pid_t pid;
    int stat;

    pid=waitpid(-1,&stat,WNOHANG);
    while(pid>0){
        printf("child process terminated (PID: %ld)\n",(long)getpid());
        pid=waitpid(-1,&stat,WNOHANG);
    }

    return;
}

int main(int argc,char *argv[])
{
    int listen_fd;
    int com_fd;
    int ret;
    int i;
    static char recv_buf[1024];    
    socklen_t len;
    int port;
    pid_t pid;

    struct sockaddr_in clt_addr;
    struct sockaddr_in srv_addr;

    if(argc!=2){
        printf("Usage: %s port\n",argv[0]);
        return 1;
    }

    port=atoi(argv[1]);

    if(signal(SIGCHLD,sig_handler)<0){
        perror("cannot set the signal");
        return 1;
    }

    listen_fd=socket(PF_INET,SOCK_STREAM,0);
    if(listen_fd<0){
        perror("cannot create listening socket");
        return 1;
    }

    memset(&srv_addr,0,sizeof(srv_addr));
    srv_addr.sin_family=AF_INET;
    srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    srv_addr.sin_port=htons(port);

    ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
    if(ret==-1){
        perror("cannot bind server socket");
        close(listen_fd);
        return 1;
    }

    ret=listen(listen_fd,5);
    if(ret==-1){
        perror("cannot listen the client connect request");
        close(listen_fd);
        return 1;
    }
    
    while(1){
        len=sizeof(clt_addr);
        com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
        if(com_fd<0){
            if(errno==EINTR){
                continue;
            }else{
                perror("cannot accept client connect request");
                close(listen_fd);
                return 1;
            }
        }

        pid=fork();
        if(pid<0){
            perror("cannot create the child process");
            close(listen_fd);
            return 1;
        }else if(pid==0){
            while((len=read(com_fd,recv_buf,1024))>0){
                printf("Message from client(%d): %s\n",len,recv_buf);
                if(recv_buf[0]=='@')
                    break;
                for(i=0;i<len;i++)
                    recv_buf[i]=toupper(recv_buf[i]);
                write(com_fd,recv_buf,len);
            }

        close(com_fd);
        return 0;
        }else
            close(com_fd);
    }    
    
    return 0;
}

本文标签

除非注明,文章均为( 老薛 )原创,转载请保留链接: http://www.bdkyr.com/xtyw003/1169.html

随便看看

0