linux下TCP/IP實現簡單聊天程序

dgy7 9年前發布 | 51K 次閱讀 Linux

可以在同一臺電腦上運行,在一個終端上運行服務器端,在一個終端上運行客戶端。

服務器端的IP地址要和本地的IP相同,并分配端口號,客戶端的默認設置為本地,端口號自動分配。


服務器端:

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <errno.h>  
    #include <string.h>  
    #include <sys/types.h>  
    #include <netinet/in.h>  
    #include <sys/socket.h>  
    #include <sys/wait.h>  
    #include <unistd.h>  
    #include <arpa/inet.h>  

    #define MAXBUF 1024  

    int main(int argc, char *argv[])  
    {  
        int pid;      
        int sockfd, new_fd;  
        socklen_t len;  
        struct sockaddr_in my_addr, their_addr;  
        unsigned int myport, lisnum;  
        char buf[MAXBUF + 1];  

        if (argv[2])  
            myport = atoi(argv[2]);  
        else  
            myport = 7575;  

        if (argv[3])  
            lisnum = atoi(argv[3]);  
        else  
            lisnum = 5;  

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

        bzero(&my_addr, sizeof(my_addr));  
        my_addr.sin_family = AF_INET;  
        my_addr.sin_port = htons(myport);  
        if (argv[1])  
            my_addr.sin_addr.s_addr = inet_addr(argv[1]);  
        else  
            my_addr.sin_addr.s_addr = INADDR_ANY;  

        if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1)   
        {  
            perror("bind");  
            exit(EXIT_FAILURE);  
        }  

        if (listen(sockfd,lisnum ) == -1)   
        {  
            perror("listen");  
            exit(EXIT_FAILURE);  
        }  
        printf("wait for connect\n");     
        len = sizeof(struct sockaddr);  
        if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1)   
        {  
            perror("accept");  
            exit(EXIT_FAILURE);  
        }   
        else  
            printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);  

        if(-1==(pid=fork()))      
        {  
            perror("fork");exit(EXIT_FAILURE);  
        }  
        else if( pid == 0)  
        {  
            while (1)   
            {  
                bzero(buf, MAXBUF + 1);  
                printf("input the message to send:");  
                fgets(buf, MAXBUF, stdin);  
                if (!strncasecmp(buf, "quit", 4))   
                {  
                    printf("i will close the connect!\n");  
                    break;  
                }  
                len = send(new_fd, buf, strlen(buf) - 1, 0);  
                if (len < 0)  
                 {  
                    printf("message'%s' send failure!errno code is %d,errno message is '%s'\n",  
                    buf, errno, strerror(errno));  
                    break;  
                }  
            }  
        }  
        else   
        {     
            while(1)  
            {  
                bzero(buf, MAXBUF + 1);  
                len = recv(new_fd, buf, MAXBUF, 0);  
                if (len > 0)  
                    printf("message recv successful :'%s',%dByte recv\n",buf, len);  
                else if (len < 0)  
                {  
                    printf("recv failure!errno code is %d,errno message is '%s'\n",  
                    errno, strerror(errno));  
                    break;  
                }  
                else  
                {  
                    printf("the other one close quit\n");  
                    break;  
                }  
            }  
        }  
        close(new_fd);  
        close(sockfd);  
            return 0;  
    }  

客戶端:

    #include <stdio.h>  
    #include <string.h>  
    #include <errno.h>  
    #include <sys/socket.h>  
    #include <resolv.h>  
    #include <stdlib.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <unistd.h>  

    #define MAXBUF 1024  

    int main(int argc, char **argv)  
    {  
        int sockfd, len;  
        struct sockaddr_in dest;  
        char buffer[MAXBUF + 1];  
        if (argc != 3)   
        {  
            printf(" error format,it must be:\n\t\t%s IP port\n",argv[0]);  
            exit(EXIT_FAILURE);  
        }  

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  
            perror("Socket");  
            exit(errno);  
        }  
        printf("socket created\n");  


        bzero(&dest, sizeof(dest));  
        dest.sin_family = AF_INET;  
        dest.sin_port = htons(atoi(argv[2]));  
        if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0)   
        {  
            perror(argv[1]);    exit(errno);  
        }  
        if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest))==-1)   
        {  
            perror("Connect ");  
            exit(errno);  
        }  
        printf("server connected\n");  

        pid_t pid;  
        if(-1==(pid=fork()))  
        {  
            perror("fork");exit(EXIT_FAILURE);  
        }  
        else if (pid==0)  
        {  
            while (1)   
            {  
                bzero(buffer, MAXBUF + 1);  
                len = recv(sockfd, buffer, MAXBUF, 0);  
                if (len > 0)  
                    printf("recv successful:'%s',%d byte recv\n",buffer, len);  
                else if(len < 0)  
                {  
                    perror("recv");  
                    break;  
                }  
                else  
                {  
                    printf("the other one close ,quit\n");  
                    break;  
                }  
            }     
        }  
        else  
        {  
            while (1)   
            {  
                bzero(buffer, MAXBUF + 1);  
                printf("pls send message to send:");  
                fgets(buffer, MAXBUF, stdin);  
                if (!strncasecmp(buffer, "quit", 4))   
                {  
                    printf(" i will quit!\n");  
                    break;  
                }  
                len = send(sockfd, buffer, strlen(buffer) - 1, 0);  
                if (len < 0)   
                {  
                    perror("send");  
                    break;  
                }  
            }  
        }  
        close(sockfd);  
        return 0;  
    }  


服務器端執行 :           ./s 192.168.142.132 7575 5


客戶端執行:               ./c 192.168.142.132 7575


其中,192.168.142.132是本機的IP地址.


服務器端信息:

root@jieniyimiao-virtual-machine:/home/jieniyimiao/c_code/linux/ch13/sock_tcp_p_p_chat# ./s 192.168.142.132 7575 5
wait for connect
server: got connection from 192.168.142.132, port 44698, socket 4
input the message to send:jieniyimiap
input the message to send:ddddddddddddddddddddddddddd
input the message to send:dddddddddddddddddddddddddddd
input the message to send:aaaaaaaaaaaaaaaaaaaaaa
input the message to send:aaaaaaaaaaaaaaaaaaaaaaaa
input the message to send:message recv successful :'dddddddddddddddddd',18Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'dddddddddddddd',14Byte recv
message recv successful :'ddddddddddddddd',15Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'dddddddddddddd',14Byte recv
quit
i will close the connect!


客戶端略:



用NETSTAT查看信息如下:

# netstat |grep 192.168.142.132

**********************************************************************************
tcp        0      0 192.168.142.132:7575    192.168.142.132:44698   ****

tcp        0      0 192.168.142.132:44698   192.168.142.132:7575    ****

 本文由用戶 dgy7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!