client.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/types.h> #include <unistd.h> #include <time.h> #define maxn 101 /** 服务器端 1>建立一个基于TCP的流套接字描述符 2>将套接字描述符绑定到本地地址和本地端口上 3>监听客户端的请求 4>通过Accept接收客户端的请求 5>发送数据/接收数据 6>关闭套接字 客户端 1>与服务器端建立链接 2> 发送数据/接收数据 3>关闭套接字 **/ int main(int argc, char** argv) { int s_socket ; //1>建立一个基于TCP的流套接字描述符 if((s_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { herror("socket"); exit(errno); } else { printf("socket create success!\n"); } //端口号 unsigned int port; if(argv[2]) { port = atoi(argv[2]); } else { port = 1111; } //2>将套接字描述符绑定到本地地址和本地端口上 struct sockaddr_in addport; bzero(&addport, sizeof(addport)); addport.sin_family = AF_INET; //addport.sin_addr.s_addr = inet_addr(argv[1]); addport.sin_port = htons(port); if(inet_aton(argv[1], (struct in_addr*)&addport.sin_addr.s_addr) == -1) { herror("port"); exit(errno); } else { printf("IP and port create success!\n"); } //建立链接 if(connect(s_socket, (struct sockaddr*)&addport, sizeof(addport)) == -1) { herror("connect"); exit(errno); } else { printf("connect success\n"); } //3>监听客户端的请求 char buf[maxn]; char buf1[maxn]; int flag = 1; while(1) { //接收信息 flag = 1; bzero(buf, maxn); int len; len = recv(s_socket, buf, maxn, 0); if(len > 0) { printf("服务器发来的信息是: %s\n", buf); } else { if(len == 0) { printf("server is closed!\n"); flag = 0; break; } else if(len == -1) { printf("receive message failure!"); } } loop: if(flag == 0) break; bzero(buf, maxn); printf("请输入要发送的信息:"); fgets(buf, maxn, stdin); if(strncasecmp(buf, "exit", 4) == 0) { printf("聊天中止\n"); break; } if(strncmp(buf, "\n", 1) == 0) { printf("空字符\n"); continue; } int L_len = strlen(buf); if(buf[L_len - 1] == '\n') { len = send(s_socket, buf, L_len - 1, 0); } else { len = send(s_socket, buf, L_len, 0); } if(len > 0) { printf("send message success!\n"); } else { printf("send message failure!\n"); break; } } close(s_socket); return 0; }