天天看點

socket程式設計(三)--實作點對點聊天程式

1. 伺服器主程式

#include "../apue.h"

void handler(int sig){

        printf("recv sig=%d\n", sig);

        exit(EXIT_SUCCESS);

}

int main(void){

        int listenfd;

        listenfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        if(listenfd < 0)

                err_exit("listen error");

        struct sockaddr_in servaddr;

        memset(&servaddr, 0, sizeof(servaddr));

        servaddr.sin_family = AF_INET;

        servaddr.sin_port = htons(5188);

        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

        //servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

        //inet_aton("127.0.0.1", $servaddr.sin_addr);

        int on=1;

        if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,&on, sizeof(on))<0)

                err_exit("setsockopt error");

        if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)

                err_exit("bind error");

        if(listen(listenfd, SOMAXCONN)<0)

        struct sockaddr_in peeraddr;

        socklen_t peerlen = sizeof(peeraddr);

        int conn;

        if((conn = accept(listenfd, (struct sockaddr*)&peeraddr, &peerlen))<0)

                err_exit("accept error");

        printf("ip=%s,port=%d\n", inet_ntoa(peeraddr.sin_addr), peeraddr.sin_port);

        pid_t pid;

        pid = fork();

    char recvbuf[1024];

    char sendbuf[1024] = {0};

    int ret;

        if(pid==-1)

                err_exit("fork error");

        else if(pid==0){

                while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){

                        write(conn, sendbuf, sizeof(sendbuf));

                        memset(sendbuf, 0, sizeof(sendbuf));

                }

                kill(pid, SIGUSR1);

                exit(EXIT_SUCCESS);

        }else{

                signal(SIGUSR1, handler);

        while (1){

            memset(recvbuf, 0, sizeof(recvbuf));

            ret = read(conn, recvbuf, sizeof(recvbuf));

                        if(ret==-1)

                                err_exit("read error");

                        else if(ret==0){

                                printf("peer close\n");

                                break;

                        }

            fputs(recvbuf, stdout);

        }

                close(listenfd);

        return 0;

2. 用戶端程式

        int socketfd;

        socketfd = socket(AF_INET, SOCK_STREAM, 0);

        if(socketfd == -1)

                err_exit("socket error");

        struct sockaddr_in clientaddr;

        memset(&clientaddr, 0, sizeof(clientaddr));

        clientaddr.sin_family = AF_INET;

        clientaddr.sin_port = htons(5188);

        clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

        conn = connect(socketfd, (struct sockaddr*)&clientaddr, sizeof(clientaddr));

        if(conn == -1)

                err_exit("connect error");

        char recvbuf[1024] = {0};

        int ret;

        pid_t pid=fork();

                        write(socketfd, sendbuf, sizeof(sendbuf));

                        ret=read(socketfd, recvbuf, sizeof(recvbuf));

                                printf("server close\n");

                        fputs(recvbuf,stdout);

                close(socketfd);

繼續閱讀