scoket linux c++
来源:互联网 发布:1688网络批发大市场 编辑:程序博客网 时间:2024/05/17 00:13
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <map>
#include <queue>
#include <pqxx/pqxx>
#define MAXBUF 1024
#define MSG_RECIVED 0
#define MSG_NEEDMORE 1
#define MSG_ERROR -1
//receive msg
int handle_message(int new_fd)
{
char buf[MAXBUF];
int len;
bzero(buf, MAXBUF);
len = recv(new_fd, buf, MAXBUF, 0);
int ret = MSG_ERROR;
if (len > 0){
if(len == 1024){
char tag = buf[1024];
if(tag == 1)
ret = MSG_NEEDMORE;
if(tag == 0)
ret = MSG_RECIVED;
else
ret = MSG_ERROR;
}else
ret = MSG_RECIVED;
if(ret != MSG_ERROR){
map<int, iostream*>::iterator iter;
iter = connectionbuf.find(new_fd);
if(iter != connectionbuf.end()){
iter->second->write(buf, len);
if(ret == MSG_RECIVED)
iter->second->flush();
}else{
ret = MSG_ERROR;
}
}
}
return ret;
}
int main(int argc, char *argv[])
{
int listener, new_fd, kdpfd, nfds, n, curfds;
socklen_t len;
struct sockaddr_in my_addr, their_addr;
struct rlimit rt;
unsigned int myport, lisnum;
myport = 4523;
lisnum = 2;
struct epoll_event ev;
struct epoll_event events[MAXEPOLLSIZE];
struct protoent *ptent = getprotobyname("tcp");
/*寮€鍚痵ocket 鐩戝惉*/
if ((listener = socket(PF_INET, SOCK_STREAM, ptent->p_proto)) == -1)
{
perror("socket create error!\n");
exit(1);
}
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons(myport);
my_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind error!\n");
exit(1);
}
if (listen(listener, lisnum) == -1)
{
perror("listen error!\n");
exit(1);
}
else
{
printf("Start socket listen server success!\n");
}
/*鍒涘缓 epoll 鍙ユ焺锛屾妸鐩戝惉 socket 鍔犲叆鍒?epoll 闆嗗悎閲?/
kdpfd = epoll_create(MAXEPOLLSIZE);
len = sizeof(struct sockaddr_in);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = listener;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)
{
fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
return -1;
}
curfds = 1;
while (1)
{
/*绛夊緟鏈変簨浠跺彂鐢?/
nfds = epoll_wait(kdpfd, events, curfds, -1);//鎸囧畾涓€涓秴鏃舵椂闂?00
if (nfds == -1)
{
if (errno == EINTR){
continue;
}
perror("epoll_wait error!\n");
break;
}
/*澶勭悊浜嬩欢*/
for (n = 0; n < nfds; ++n)
{
if (events[n].data.fd == listener)
{
/*鍒涘缓 epoll 鍙ユ焺锛屾妸鐩戝惉 socket 鍔犲叆鍒?epoll 闆嗗悎閲?/
kdpfd = epoll_create(MAXEPOLLSIZE);
len = sizeof(struct sockaddr_in);
ev.events = EPOLLIN | EPOLLET;
ev.data.ptr = ConnectionManager::GetInstance()->OnSocketConnectec(fd);
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)
{
fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
return -1;
}
}
else{
SocketHolder* holderPtr = static_cast<SocketHolder*>(events[n].data.ptr);
s_revbuffers.find(holderPtr)->second.push();
if(holder->ok){
s_messagebuffers.push(MessageHolder*)
holderPtr->OnMessageRecived();
}
}
}
}
}
- scoket linux c++
- Linux ScoKet编程
- linux scoket 详解
- C语言实现scoket通信。
- Scoket
- Scoket
- Linux下Scoket聊天程序
- java Scoket的c\\s结构聊天室
- linux scoket 由浅入深系列-------- 详解(四)
- scoket应用描述-结合c与Per两种使用方法
- Scoket Sample
- scoket编程
- scoket程序
- Scoket 编程
- Scoket编程
- scoket基础
- scoket.io
- Scoket练习
- 《Linux那些事儿之我是USB》我是U盘(27)彼岸花的传说(六)
- 某人收集的架构blog
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- Ts'o其人
- 学习ISA2004——《ISA Server 2004 常规部署方案》
- scoket linux c++
- 资治通鉴,卷六十四,袁绍与曹操的对话
- classload装载
- C# 判断 DataGridView 每行的 CheckBox 列是否被选中
- 基于Windows的iPad/iPhone开发编译环境
- 仿淘宝图片放大处理
- GUI命令行浅析
- 使用Apache的BeanUtils进行JavaBean的反射操作
- 在word任意页码插入开始页码(图解)