简单聊天室项目代码解读-client.c
源码来自于网络:CSDN博客
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<pthread.h>#include<netinet/in.h>#include<arpa/inet.h>#include<fcntl.h>#include<unistd.h>#define BUFFSIZE 128#define HOST_IP "127.0.0.1"#define PORT 8000int sockfd;void snd();int main(){pthread_t thread; // pthread_t 线程,gcc编译时需加上-lpthreadstruct sockaddr_in serv_addr; // struct sockaddr_inchar buf[BUFFSIZE];// 初始化服务端地址结构bzero(&serv_addr, sizeof(struct sockaddr_in)); // bzero 清零serv_addr.sin_family = AF_INET; // sin_family AF_INETserv_addr.sin_port = htons(PORT); // sin_port htons(PORT)inet_pton(AF_INET, HOST_IP, &serv_addr.sin_addr); // inet_pton 按地址族协议来对点分十进制的IPV4字符串进行转化->服务端的地址结构// 创建客户端套接字sockfd = socket(AF_INET, SOCK_STREAM, 0); // socket 创建套接字if(sockfd < 0){perror("fail to socket");exit(-1);}// 与服务器建立连接printf("connecting. \n");//客户端的缝缝补补sleep(1);printf("connecting.. \n");sleep(1);printf("connecting... \n");//*****************************//if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) // connect{perror("fail to connect");exit(-2);}/* === 从此处开始 程序分做两个线程 === */// 创建发送消息的线程,调用发送消息的函数sndpthread_create(&thread, NULL, (void *)(&snd), NULL); // pthread_create// 接收消息的线程while(1){int len;if((len=read(sockfd, buf, BUFFSIZE)) > 0) // read 读取通信套接字{buf[len] = '\0'; // 添加结束符,避免显示缓冲区中残留的内容printf("\n%s", buf);fflush(stdout); // fflush 冲洗标准输出,确保内容及时显示}}return 0;}// 发送消息的函数void snd(){char name[32], buf[BUFFSIZE];fgets(name, 32, stdin); // fgets 会读取输入字符串后的换行符 从终端读取 名字和待发送的字符串 到缓冲区bufwrite(sockfd, name, strlen(name)); // write 写入通信套接字while(1){fgets(buf, BUFFSIZE, stdin);write(sockfd, buf, strlen(buf));if(strcmp(buf, "bye\n") == 0) // 注意此处的\n 比较字符串是否为退出exit(0);}}