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();
    }

   }
  }
 }

}

原创粉丝点击