linux下TCP/IP实现简单聊天程序

dgy7 9年前

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。

服务器端的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    ****