/*
* Server.cpp
*
* Created on: 2012-10-16
* Author: blackhole
*/
#include "Server.h"
#include "malloc.h"
list<int> Server::clientlist;
//服务器
int Server::CreateThread(void *(*fun)(void *), void *__restrict arg) {
int res = 0;
pthread_t id;
res = pthread_create(&id, NULL, fun, arg);
return res;
}
void *Server::SendMessage(void *arg) {
printf("Now send...\n");
int len;
char *senddata = (char *) arg;
list<int>::iterator i;
for (i = clientlist.begin(); i!= clientlist.end(); ++i) {
len = send(*i, senddata, strlen(senddata), 0);
if (-1 == len) {
printf("Failed to send");
}
printf("发送:%s\n", senddata);
}
return NULL;
}
void *Server::RecvMessage(void *connfd) {
int len;
char recv_buf[1024];
while (1) {
memset(recv_buf, 0, sizeof(recv_buf));
printf("Now recv...\n");
len = recv(*(int*) connfd, recv_buf, sizeof(recv_buf), 0);
printf("接受%d个字符\n", len);
if (-1 == len) {
printf("Failed to recv");
}
if (0 == len) {
printf("break %d\n", *(int*) connfd);
list<int>::iterator ii;
for (ii = clientlist.begin(); ii != clientlist.end(); ++ii) {
if (*ii == *((int *)connfd))
{
close(*((int *)connfd));
clientlist.erase(ii);
break;
}
}
break;
}
printf("Receive message:%s\n", recv_buf);
SendMessage((void *) recv_buf);
}
return ((void *) 0);
}
int Server::StartServerByIpPort(const char* ip, int port) {
int res = 0;
lisenfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == lisenfd) {
perror("Failed to socket");
return -1;
}
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(port); //这里输入服务器端口号
ser_addr.sin_addr.s_addr = inet_addr(ip); //htonl(INADDR_ANY); //INADDR_ANY表示本机IP
if (-1 == bind(lisenfd, (struct sockaddr *) &ser_addr, sizeof(ser_addr))) {
perror("Failed to bind");
return -2;
}
printf("Now listen...\n");
if (-1 == listen(lisenfd, 10)) {
perror("Failed to listen");
return -3;
}
while (1) {
memset(&cli_addr, 0, sizeof(cli_addr));
unsigned int cli_len;
cli_len = sizeof(cli_addr);
printf("Now accept...\n");
int *connfd = (int *) malloc(sizeof(int));
*connfd = accept(lisenfd, (struct sockaddr *) &cli_addr, &cli_len);
if (-1 == *connfd) {
perror("Failed to accept");
return -4;
}
clientlist.push_front(*connfd);
pthread_t recvdid;
int ctres = pthread_create(&recvdid, NULL, RecvMessage,(void *) connfd);
printf("创建接受线程状态%d\n", ctres);
if (ctres != 0) {
printf("Failed to create thread!");
}
}
return res;
}
void Server::StopServer() {
list<int>::iterator i;
for (i = clientlist.begin(); i != clientlist.end(); ++i) {
close(*i);
}
clientlist.clear();
close(lisenfd);
}
Server::~Server() {
StopServer();
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Linux_MultithreadChat_src.zip (46个子文件)
ChatServer
Server.cpp 3KB
Release
sources.mk 526B
subdir.mk 722B
ChatServerMain.o 2KB
objects.mk 250B
ChatServer 13KB
Server.o 5KB
makefile 1KB
ChatServerMain.d 66B
Server.d 50B
Server.h 729B
ChatServerMain.cpp 456B
.project 2KB
.cproject 13KB
Debug
sources.mk 526B
subdir.mk 726B
ChatServerMain.o 89KB
objects.mk 250B
ChatServer 190KB
Server.o 116KB
makefile 1KB
ChatServerMain.d 66B
Server.d 50B
ChatClient
Release
ChatClientMain.o 2KB
sources.mk 526B
subdir.mk 722B
objects.mk 250B
Client.o 3KB
ChatClient 12KB
makefile 1KB
Client.d 50B
ChatClientMain.d 66B
ChatClientMain.cpp 502B
Client.h 705B
Client.cpp 2KB
.project 2KB
.cproject 12KB
Debug
ChatClientMain.o 89KB
sources.mk 526B
subdir.mk 726B
objects.mk 250B
Client.o 65KB
ChatClient 155KB
makefile 1KB
Client.d 50B
ChatClientMain.d 66B
共 46 条
- 1
Kinder.Li
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页