1. #include "hl.h"
    2. void usage (char *s)
    3. {
    4. printf ("\n%s serv_ip serv_port", s);
    5. printf ("\n\t serv_ip: server ip address");
    6. printf ("\n\t serv_port: server port(>5000)\n\n");
    7. }
    8. int main (int argc, char **argv)
    9. {
    10. int fd = -1;
    11. int port = -1;
    12. struct sockaddr_in sin;
    13. if (argc != 3) {
    14. usage (argv[0]);
    15. exit (1);
    16. }
    17. /* 1. 创建socket fd */
    18. if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
    19. perror ("socket");
    20. exit (1);
    21. }
    22. port = atoi (argv[2]);
    23. if (port < 5000) {
    24. usage (argv[0]);
    25. exit (1);
    26. }
    27. /*2.连接服务器 */
    28. /*2.1 填充struct sockaddr_in结构体变量 */
    29. bzero (&sin, sizeof (sin));
    30. sin.sin_family = AF_INET;
    31. sin.sin_port = htons (port); //网络字节序的端口号
    32. if (inet_pton (AF_INET, argv[1], (void *) &sin.sin_addr) != 1) {
    33. perror ("inet_pton");
    34. exit (1);
    35. }
    36. if (connect (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {
    37. perror ("connect");
    38. exit (1);
    39. }
    40. printf ("Client staring...OK!\n");
    41. int ret = -1;
    42. fd_set rset;
    43. int maxfd = -1;
    44. struct timeval tout;
    45. char buf[BUFSIZ];
    46. while (1) {
    47. FD_ZERO (&rset);
    48. FD_SET (0, &rset);
    49. FD_SET (fd, &rset);
    50. maxfd = fd;
    51. tout.tv_sec = 5;
    52. tout.tv_usec = 0;
    53. select (maxfd + 1, &rset, NULL, NULL, &tout);
    54. if (FD_ISSET (0, &rset)) {
    55. bzero (buf, BUFSIZ);
    56. do {
    57. ret = read (0, buf, BUFSIZ - 1);
    58. } while (ret < 0 && EINTR == errno);
    59. if (ret < 0) {
    60. perror ("read");
    61. continue;
    62. }
    63. if (!ret)
    64. continue;
    65. if (write (fd, buf, strlen (buf)) < 0) {
    66. perror ("write() to socket");
    67. continue;
    68. }
    69. if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) { //用户输入了quit字符
    70. printf ("Client is exiting!\n");
    71. break;
    72. }
    73. }
    74. if (FD_ISSET (fd, &rset)) {
    75. bzero (buf, BUFSIZ);
    76. do {
    77. ret = read (fd, buf, BUFSIZ - 1);
    78. } while (ret < 0 && EINTR == errno);
    79. if (ret < 0) {
    80. perror ("read from socket");
    81. continue;
    82. }
    83. if (!ret)
    84. break; /* 服务器关闭 */
    85. printf ("server said: %s\n", buf);
    86. if ((strlen(buf) > strlen(SERV_RESP_STR)) && !strncasecmp (buf+strlen(SERV_RESP_STR), QUIT_STR, strlen (QUIT_STR))) { //用户输入了quit字符
    87. printf ("Sender Client is exiting!\n");
    88. break;
    89. }
    90. }
    91. }
    92. /*4.关闭套接字 */
    93. close (fd);
    94. }