服务器端代码
/*
*=====================================================================================
*
* Filename: server.cc
* Description:
* Version: 1.0
* Created: 2008年12月18日09时50分50秒CST
* Revision: none*
* Author: ugg(ugg_xchj@yahoo.com.cn)
* Company:
*
*=====================================================================================
*/
#include<string>
#include<iostream>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<map>
usingnamespace::std;
structclientInfo
{
stringhost;
intport;
};
typedefmap<int,clientInfo>mapgroups;
typedefmap<int,clientInfo>::iteratormapgroupsor;
typedefmap<int,clientInfo>::const_iteratormapgroupscor;
// 记录客户端的信息
mapgroupsgroups;
//默认内容设置
stringhostname="localhost";
int hostport=7763;
stringserversendContents="thisisserver";
voidgetCMD(intargc,char*argv[])
{
switch(argc)
{
case2:
hostname=argv[1];
break;
case3:
hostname=argv[1];
hostport=atoi(argv[2]);
if(hostport<1024||hostport>65535)
{
cerr<<"Error:port="<<hostport
<<"Error,range1024-65535"<<endl;
exit(0);
}
break;
case4:
hostname=argv[1];
hostport=atoi(argv[2]);
if(hostport<1024||hostport>65535)
{
cerr<<"Error:port="<<hostport
<<"Error,range1024-65535"<<endl;
exit(0);
}
serversendContents=argv[3];
break;
default:
break;
}
}
voidclearfd(intfd,fd_set&rdfds)
{
FD_CLR(fd,&rdfds);
mapgroupsorit=groups.find(fd);
if(it!=groups.end())
{
cerr<<"clienthost="<<it->second.host<<",port="<<it->second.port
<<"close"<<endl;
groups.erase(fd);
}
}
//recvandsendmessage
voidrecvandsend(intfd,fd_set&rdfds,string&contents,conststring&texts)
{
//接受消息
charbuffer[1024];
intrets=0;
intret=0;
ret=recv(fd,buffer,8,0);
if(ret==0)
{
clearfd(fd,rdfds);
return;
}
if(ret==8)
{
buffer[8]='';
intlen=atoi(buffer);
if(len<1024){
while((ret=recv(fd,buffer,len,0))>0)
{
contents.append(buffer,ret);
rets+=ret;
len-=ret;
if(len==0)
break;
}
if(ret==0){
clearfd(fd,rdfds);
return;
}
}else{
intbuflen=1024;
while((ret=recv(fd,buffer,buflen,0))>0)
{
contents.append(buffer,ret);
rets+=ret;
len-=ret;
if(len<2048){
buflen=len;
}
if(len<=0)
break;
}
if(ret==0){
clearfd(fd,rdfds);
return;
}
}
}else{
clearfd(fd,rdfds);
return;
}
//发送信息
sprintf(buffer,"%8d",texts.length());
stringsendContents=string(buffer,8);
sendContents+=texts;
constchar*content=sendContents.c_str();
intsend=0;
intlength=sendContents.length();
//send
while(1)
{
intret=write(fd,content+send,length-send);
if(ret==0)
{
//serverclose
cerr<<"Error:serverclose"<<endl;
clearfd(fd,rdfds);
return;
}
send+=ret;
if(length==send)
break;
}
}
int
main(intargc,char*argv[])
{
getCMD(argc,argv);
intfd;
//createsocket
if((fd=socket(PF_INET,SOCK_STREAM,0))==-1)
{
cerr<<"Error:socket()"<<endl;
exit(0);
}
//
structhostent*he;
he=gethostbyname(hostname.c_str());
if(he==NULL){
cerr<<"Error:gethostbyname()error,hostname="<<hostname<<endl;
exit(0);
}
structsockaddr_inserv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(hostport);
serv_addr.sin_addr=*((structin_addr*)he->h_addr);
bzero(&(serv_addr.sin_zero),8);
//bind
if(bind(fd,(structsockaddr*)&serv_addr,sizeof(serv_addr))==-1){
cerr<<"Error:bind()error"<<endl;
exit(0);
}
//listen
intret_listen=listen(fd,5);
if(ret_listen<0)
{
cerr<<"Error:Listenporterror,socketfd:"<<fd<<endl;
cerr<<"Error:listenerrno="<<ret_listen<<endl;
exit(0);
}
fd_setrdfds;
intnfds;
//Firstpollthesockets
FD_ZERO(&rdfds);
FD_SET(fd,&rdfds);
while(1)
{
if((nfds=select(FD_SETSIZE,&rdfds,NULL,NULL,NULL))<0){
if(errno!=EINTR){
cerr<<"Error:selecterror"<<endl;
exit(3);
}
}
if(FD_ISSET(fd,&rdfds))
{
socklen_tlen;
structsockaddr_inclient_addr;
len=sizeof(structsockaddr);
intclientfd=accept(fd,(structsockaddr*)&client_addr,&len);
if(clientfd==-1)
{
cerr<<"Error:acceptclienterror"<<endl;
}else{
clientInfoinfo;
info.host=inet_ntoa(client_addr.sin_addr);
info.port=ntohs(client_addr.sin_port);
cerr<<"server:gotconnectionfrom"<<info.host
<<",port"<<info.port<<endl;
groups.insert(make_pair(clientfd,info));
FD_SET(clientfd,&rdfds);
}
}else{
mapgroupscorit;
for(it=groups.begin();it!=groups.end();++it)
{
if(FD_ISSET(it->first,&rdfds))
{
stringstrRev;
recvandsend(it->first,rdfds,strRev,serversendContents);
break;
}
}
}
}
return0;
} /*---------- endoffunctionmain ----------*/
上面的代码在linux下已经编译通过
分享到:
相关推荐
Video_Live_Stream是在Linux系统下基于python调用ffmpeg实现的简易推流工具,基本功能如下: * 读取播放列表,按列表顺序循环推流视频至rtmp服务器。 * 添加了`bilibili直播间弹幕模块`,可接收及发送弹幕。 * 可...
利用基于CY7C68013A控制器芯片的支持USB3.0(向下兼容2.0)接口,以大容量NAND门闪速存储器和基于通用可编程微处理器AT90S8515的通用可编程接口GPIF FLOWSTATES流模式,实现与传感器的无胶连接,实现了串行总线对图像系统...
1.3.2 利用继承实现变化的封装和简单的复用 1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系...
一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,...
1.3.2 利用继承实现变化的封装和简单的复用 1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 ...
INDY中的IdUDPServer和IdUDPClient,支持Id_IPv4和Id_IPv6协议,使用该组件组成一个基于UDP的C/S模式的阻塞式无连接网络数据通信系统,用网络广播方法实现会话通信,并使用IdAntiFreeze组件解决了用户界面冻结的问题。...
一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,...
L,主要采用 Struts 框架技术,实现了一个基于 web的 B/S 模式的网上楼房销售系 统。其主要功能包括对外沟通展示功能、信息发布功能、在线楼房展示功能、到在线洽 谈功能、在线交易功能、在线采购功能、在线客户服务...
在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言...
伴随着Internet的迅速发展,计算机技术正在由基于C/S(client/ Server)模式的应用系统转变为基于B/S模式的应用系统。 过去,网络软件的开发都采用C/S(client)模式,在这种模式下,主要的业务逻辑都集中于客户端...
4.流模式与数据报模式 ; 5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。 接下来将以图片传输为例,用Python和C++实现服务端和客户端。这里不用语言得到的端口之间也可以互相连接。 ### 二. ...
一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,...
一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间
本文将首先从Intranet的安全性入手, 分析Intranet面临的安全问题,讨论Intranet安全设计需求,然后详述防火墙的背景知识和关键技术,最后重点介绍我们提出的基于Linux平台的复合防火墙的设计和实现。 ...
3.1.2体系数据流图 10 3.2公共汽车询问查找体系的用途 10 3.3公共汽车询问查找体系的数据库设计 11 3.3.1E-R图 11 3.3.2数据库表设计 12 4公共汽车询问查找体系的设计与达到 14 4.1创建超级用户登录的服务连接器 14 ...
一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,...
// 获得流,并写入buffer中 NetworkStream streamToClient = remoteClient.GetStream(); byte[] buffer = new byte[BufferSize]; int bytesRead = streamToClient.Read(buffer, 0, BufferSize); Console....
一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,...