www.pudn.com > linuxsocket.rar > my_client.c
#include#include #include #include #include #include #include #include #include #include "my_recv.h" #define INVALID_USERINFO 'n' // 用户信息无效 #define VALID_USERINFO 'y' // 用户信息有效 /*获取用户输入存入到buf,buf的长度为len,用户输入数据以'\n'为结束标志*/ int get_userinfo(char *buf, int len) { int i; int c; if (buf == NULL) { return -1; } i = 0; while ( ((c = getchar()) != '\n') && (c != EOF) && (i < len-2) ) { buf[i++] = c; } buf[i++] = '\n'; buf[i++] = '\0'; return 0; } // 输入用户名,然后通过fd发送出去 void input_userinfo(int conn_fd, const char *string) { char input_buf[32]; char recv_buf[BUFSIZE]; int flag_userinfo; // 输入用户信息直到正确为止 do { printf("%s:", string); if (get_userinfo(input_buf, 32) < 0) { printf("error return from get_userinfo\n"); exit(1); } if (send(conn_fd, input_buf, strlen(input_buf), 0) < 0) { my_err("send", __LINE__); } // 从连接套接字上读取一次数据 if (my_recv(conn_fd, recv_buf, sizeof (recv_buf)) < 0) { printf("data is too long\n"); exit(1); } if (recv_buf[0] == VALID_USERINFO) { flag_userinfo = VALID_USERINFO; } else { printf("%s error,input again,", string); flag_userinfo= INVALID_USERINFO; } } while(flag_userinfo == INVALID_USERINFO); } int main(int argc, char **argv) { int i; int ret; int conn_fd; int serv_port; struct sockaddr_in serv_addr; char recv_buf[BUFSIZE]; // 检查参数个数 if (argc != 5) { printf("Usage: [-p] [serv_port] [-a] [serv_address]\n"); exit(1); } // 初始化服务器端地址结构 memset(&serv_addr, 0, sizeof (struct sockaddr_in)); serv_addr.sin_family = AF_INET; // 从命令行获取服务器端的端口与地址 for (i=1; i 65535) { printf("invalid serv_addr.sin_port\n"); exit(1); } else { serv_addr.sin_port = htons(serv_port); } continue; } if (strcmp("-a", argv[i]) == 0) { if (inet_aton(argv[i+1], &serv_addr.sin_addr) == 0) { printf("invalid server ip address\n"); exit(1); } continue; } } // 检测是否少输入了某项参数 if (serv_addr.sin_port == 0 || serv_addr.sin_addr.s_addr == 0) { printf("Usage: [-p] [serv_addr.sin_port] [-a][serv_address]\n"); exit(1); } // 创建一个TCP套接字 conn_fd = socket(AF_INET, SOCK_STREAM,0); if (conn_fd < 0) { my_err("socket", __LINE__); } // 向服务器端发送连接请求 if (connect(conn_fd, (struct sockaddr *)&serv_addr, sizeof (struct sockaddr)) < 0) { my_err("connect", __LINE__); } // 输入用户名和密码 input_userinfo(conn_fd, "username"); input_userinfo(conn_fd, "password"); // 读取欢迎信息并打印出来 if ((ret = my_recv(conn_fd, recv_buf, sizeof (recv_buf))) < 0) { printf("data is too long\n"); exit(1); } for (i=0; i