资源简介
linux运行的聊天室程序,多客户端登录后,将任意客户端数据发送给其他登录的客户端
代码片段和文件信息
#include “chat_room_client.h“
int main()
{
int sfd;
struct sockaddr_in addr_server;
bzero(&addr_server sizeof(addr_server));
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(MY_PORT);
addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
sfd = socket(AF_INET SOCK_STREAM 0);
if (sfd < 0)
return -1;
if (connect(sfd (struct sockaddr*)&addr_server sizeof(addr_server)) < 0) {
close(sfd);
return -1;
}
printf(“connect is success\n“);
/*注册文件描述符,0用于输出,1用于读socket上的内容*/
pollfd fds[2];
fds[0].fd = 0;
fds[0].events = POLLIN | POLLOUT;
fds[0].revents = 0;
fds[1].fd = sfd;
fds[1].events = POLLIN | POLLRDHUP; //服务器关闭连接时,设置为POLLRDHUP
fds[1].revents = 0;
char read_buf[BUFFER_SIZE]; //64
/*准备两个管道*/
int pipefd[2];
int ret = pipe(pipefd);
if (ret < 0)
return -1;
while (1)
{
ret = poll(fds 2 -1);
if (ret < 0) {
printf(“poll() error\n“);
return -1;
}
/*服务器关闭*/
if (fds[1].revents & POLLRDHUP) {
printf(“server close the connect!\n“);
break;
}
/*socket缓冲区有数据可读*/
if (fds[1].revents & POLLIN) {
memset(read_buf ‘\0‘ BUFFER_SIZE);
recv(fds[1].fd read_buf BUFFER_SIZE - 1 0);
printf(“%s\n“ read_buf);
}
/*客户端用户输入数据使用splice函数,实现零拷贝*/
/*ssize_t splice(int fd_inloff_t* off_tint fd_outloff_t* off_outsize_t lenunsigned int flags);
fd_in:待输入数据的文件描述符.
off_t:如果fd_in是一个管道文件描述符那么off_t参数必须是NULL表示从数据流的当前偏移位置读入;如果fd_in不是一个管道文件描述符(例如socket),则它将指出具体的偏移位置.
len:指定移动数据的长度.
flags:则控制数据如何移动,它可以被设置为下表中值的按位异或.*/
if (fds[0].revents & POLLIN) {
ret = splice(0 NULL pipefd[1] NULL 32768 SPLICE_F_MORE | SPLICE_F_MOVE); //0是标准输入的文件描述符
ret = splice(pipefd[0] NULL sfd NULL 32768 SPLICE_F_MORE | SPLICE_F_MOVE);
//为什么不直接将0->sfd? 因为使用splice函数时,fd_in和fd_out必须至少有一个管道文件描述符
}
}
close(sfd);
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-06-03 09:50 char_room\
文件 9153 2019-06-03 09:50 char_room\chat_client
文件 2115 2019-06-03 09:50 char_room\chat_room_client.cpp
文件 324 2019-06-03 09:50 char_room\chat_room_client.h
文件 2952 2019-06-03 09:50 char_room\chat_room_client.o
文件 5965 2019-06-03 09:50 char_room\chat_room_server.cpp
文件 582 2019-06-03 09:50 char_room\chat_room_server.h
文件 6960 2019-06-03 09:50 char_room\chat_room_server.o
文件 13819 2019-06-03 09:50 char_room\chat_server
文件 258048 2019-06-03 09:50 char_room\core
文件 364 2019-06-03 09:50 char_room\makefile
- 上一篇:计算机三级嵌入式.zip
- 下一篇:医疗商务平台招标书
相关资源
- 跟老男孩学linux三剑客命令V1.5.rar
- petalinux2018.3.txt
- 基于嵌入式linux系统下的画板小程序
- linux下使用原始套接字抓包并发现网络
- linux内核解析精品电子书大全
- linux-在shell脚本中使用加密密码的轻量
- VC 截获QQ聊天内容和登录密码.rar
- linux-极路由闪讯netkeeper安装
- 嵌入式系统/ARM技术中的基于嵌入式
- linux_c_qq语音聊源代码
- linux 字符设备驱动程序
- linux下使用curses库实现滚屏、彩色打印
- CentOS5到CentOS7镜像
- intel parallel studio XE 2016 with update 1 fo
- linux期末大作业参考 北邮
- 局域网内的两台Linux实现一端录音,一
- linux语音聊天
- chkconfig.deb
- 老王2018Linux运维.zip
- Quectel_LTE&5G_Linux_USB_Driver_User_Guide_V2.
- kali-linux-2017.3-vm-i386 32位
- linux-KVM虚拟机GPU透传操作步骤.docx
- mcp23017 linux 驱动 支持扩展io中断
- 武汉理工大学TCPIP及网络编程复习重点
- Linux下sar工具使用
- linux高性能服务器编程源码66818
- windows-linux基线离线扫描脚本.zip
- SLE-15-SP2-Full-x86_64-GM-Media2.iso
- 并发服务器的三种实现模型测试代码
- iMX6从uboot到linux启动完成一直保持LO
评论
共有 条评论