C++ 简易scoket Server

分享到:
//
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/select.h>
#define MAXUSERS 5
#define BUFFER_SIZE 64
#define FD_LIMIT 65535
int USERS[MAXUSERS];
int user_count = 0;
void showclient()
{
int i;
printf("user_count: %d\n", user_count);
for (i = 0; i < MAXUSERS; i++) {
printf("[%d]:%d  ", i, USERS[i]);
}
printf("\n\n");
}
int main(int argc, const char * argv[])
{
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
socklen_t client_addrlength = sizeof(client_addr);
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(33333);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//创建
int sock_fd = socket( PF_INET, SOCK_STREAM, 0 );
if (sock_fd<0) {
printf("socket error:%d",errno);
close(sock_fd);
exit(1);
}
int yes = 1;
if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
int sret;
//绑定
sret = bind( sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr) );
if (sret<0) {
printf("bind error:%d",errno);
close(sock_fd);
exit(2);
}
//监听
sret = listen(sock_fd, MAXUSERS);
if (sret<0) {
printf("listen error:%d",errno);
close(sock_fd);
exit(3);
}
printf("start ok, listen port:%d\n", ntohs(server_addr.sin_port));
char buf[1024];
int maxsock = sock_fd;
fd_set read_fds;
//可读
ssize_t ret;
while (1) {
FD_ZERO(&read_fds);
FD_SET(sock_fd, &read_fds);
//需要监听的集合
for (int i =0; i<user_count; i++) {
if (USERS[i] != 0) {
FD_SET(USERS[i], &read_fds);
}
}
//注册监听事件
ret = select(maxsock+1, &read_fds, NULL, NULL, NULL);
if (ret<0) {
printf("select error\n");
continue;
}else if (ret==0){
printf("select timeout\n");
continue;
}
//读取客户端发来的数据
for (int i =0; i<user_count; i++) {
if (FD_ISSET(USERS[i], &read_fds)) {
ret = recv(USERS[i], buf, sizeof(buf), 0);
printf("client[%d] send:%s\n", i, buf);
}
}
//处理新用户链接
if (FD_ISSET(sock_fd, &read_fds)) {
printf("new client\n");
int new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &client_addrlength);
if (new_fd<0) {
printf("accept error\n");
close(new_fd);
continue;
}
USERS[user_count] = new_fd;
printf("new connection client[%d] %s:%d\n", user_count,
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
user_count++;
if (new_fd > maxsock){
maxsock = new_fd;
}
}
showclient();
}
close(sock_fd);
return 0;
}

昵    称:
验证码:

相关文档:

  • C++操作SQLite数据库
    在使用C++操作SQLite之前,需要获得sqlite3.h,sqlite3.lib,sqlite3.dll,大家可以在这里下载。并将这3个文件导入VC++工程中。其中sqlite3.dll文件...
  • C语言实现gsoap输出数据类型到XML的方法
    C语言实现gsoap输出数据类型到XML的方法...
  • C++ 解析器线程的传播库:libpondyparser
    libpondyparser 是另一个使用 Markov 模型的多核 C++ 解析器线程的传播库,包含了一个使用增强学习传播的线程来打包一个指向统计解析库的...
  • C++模板库 Standard Portable Library
    Standard Portable Library 是一个指针友好的 C/C++ 标准模板库的替代产品,它所提供的 API 跟 Java 或者是 .NET 的语言类似,包括公用的数据结构...
  • 小型的GNU环境 MSys
    MSYS:Minimal GNU(POSIX)system on Windows,是一个小型的GNU环境,包括基本的bash,make等等。是Windows下最优秀的GNU环境。(是否厌倦了Cygwin蜗...
  • STL之防止内存泄露
    可以自由分配和释放内存造就了C++的灵活和强大,但这也是使用C++最容易出现问题的地方,内存泄露问题,估计程序猿都会或多或少的...
  • C++对象池 C++ ResourcePool
    C++ ResourcePool 是一个C++语言开发的通用的对象池,提供一个独立的类型无关的API。...
  • Qt集成开发环境IDE Monkey Studio
    Monkey Studio (MkS) 是一个采用 C++ 和 Qt 库开发的跨平台集成开发环境,旨在开发基于 Qt 的应用程序。...
  • 解析程序参数的C语言库 - The Lean Mean C++ Option Parser
    The Lean Mean C++ Option Parser 是一个用来解析程序参数 (argc, argv) 的 C 库,支持短和长的参数格式 getopt(), getopt_long(), and getopt_long_only(), 但提供...
  • 简单的C++开发工具 Sally
    "Sally - A Simple C++ IDE" 是一个简单的 Windows XP 以及以上版本下运行的 C++ 语言集成开发环境,该工具采用 C# 开发,需要有 .NET 框架 1...
  • 分布式C/C++编译工具 distcc
    distcc是一个分布式的C/C++编译工具,它可以组织一个网络内的多台计算机同时进行某个编译任务。下图是distcc提供的监控工具,用于查看...
  • wxWidgets对话框设计器 wxDev-C++
    wxDev-C++是一个 Dev-C++的扩展由科林拉普拉斯等开发。 该软件可以帮助您在创建和框架的对话框使用wxWidgets的形式直观地设计。 随Dev-C++的...
  • C++加密/解密库:libsodium
    libsodium 是一个流行、易于使用的软件库。主要用于加密、解密、签名和生成密码哈希等等。这是一个可移植的、跨编译器支持、可安装...
  • C语言的SPDY开发包 libspdy
    libspdy 是 C 语言实现对 SPDY 协议支持的库。只需依赖 zlib 包...
  • C++ Resources Compiler - 生成 C++ 源码文件
    C++ Resources Compiler 是一个工具,用来生成一个 C++ 源码文件,包括相应的头文件,用以嵌入任意数据文件并提供一个 Resource 类用来访问这...
  • 几何数学库:OpenGL Mathematics
    由于C/C++标准库中没有几何数学库,这样造成在开发一个三维系统之初往往都需要自行实现一个实用的几何数学库,这样太费时费力了。...
  • c++中string用法汇总
    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且...
  • C++ 工具类库:Moost
     Last.fm 的音乐信息检索团队近日开源了 moost 工具,这是该团队在产品开发过程中使用的 C++ 实用程序的集合。...
  • Node.js的C++移植版本 Node.native
    node.native 是 node.js 的一个 C++11 (aka C++0x) 的一个移植。...
  • C++ STL set集合容器常用用法
    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每...