简单聊天室项目代码解读-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 8000
int sockfd;
void snd();
int main()
{
pthread_t thread; // pthread_t 线程,gcc编译时需加上-lpthread
struct sockaddr_in serv_addr; // struct sockaddr_in
char buf[BUFFSIZE];
// 初始化服务端地址结构
bzero(&serv_addr, sizeof(struct sockaddr_in)); // bzero 清零
serv_addr.sin_family = AF_INET; // sin_family AF_INET
serv_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);
}
/* === 从此处开始 程序分做两个线程 === */
// 创建发送消息的线程,调用发送消息的函数snd
pthread_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 会读取输入字符串后的换行符 从终端读取 名字和待发送的字符串 到缓冲区buf
write(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);
}
}
  


全部评论

相关推荐

黑皮白袜臭脚体育生:简历条例统一按使用了什么技术实现了什么功能解决了问题或提升了什么性能指标来写会好些,如使用布隆过滤器实现了判断短链接是否存在,大大提升了查询速度
点赞 评论 收藏
分享
02-16 00:16
已编辑
湖北大学 Java
Java抽象带篮子:java简历怎么写可以看看我发的帖子,很详细的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务