資源簡介
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
- 下一篇:醫療商務平臺招標書
評論
共有 條評論