// 记录sock peer信息 void log_peer_info(int fd, const char* msg) { char addr[INET_ADDRSTRLEN]; uint32_t port; getpeerinfo(fd, addr, &port); fprintf(stdout, "%s %s:%d\n", msg, addr, port); }
int ServerPeerSocket::InitPeerInfo(){ if(_socket<0){ return -1; } PeerInfo tmp("", 0); int32_t ret = getpeerinfo((int32_t)_socket, tmp); if (ret != 0) { return ret; } _peerinfo = SharedPointer<PeerInfo>(new PeerInfo(tmp.GetHost(), tmp.GetPort())); return 0; }
int handle_socket_read(int fd) { char buff[s_recv_buff_size]; memset(buff, 0, s_recv_buff_size); char addr[INET_ADDRSTRLEN]; uint32_t port = 0; getpeerinfo(fd, addr, &port); int recv_count = -1; while ((recv_count = wrap_read(fd, buff, s_recv_buff_size)) >= 0) { if (0 == recv_count) { handle_socket_close_event(fd); break; } buff[recv_count] = '\0'; // write(fd, buff, recv_count); fprintf(stdout, "%s say: %s\n", addr, buff); } return recv_count; }
void icbd_accept(int fd, short event __attribute__((__unused__)), void *arg) { struct icbd_listener *l = arg; struct sockaddr_storage ss; struct timeval p = { 1, 0 }; struct icb_session *is; socklen_t ss_len = sizeof ss; int s, on = 1, tos = IPTOS_LOWDELAY; ss.ss_len = ss_len; s = accept(fd, (struct sockaddr *)&ss, &ss_len); if (s == -1) { switch (errno) { case EINTR: case EWOULDBLOCK: case ECONNABORTED: return; case EMFILE: case ENFILE: event_del(&l->ev); evtimer_add(&l->pause, &p); return; default: syslog(LOG_ERR, "accept: %m"); return; } } if (ss.ss_family == AF_INET) if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof tos) < 0) syslog(LOG_WARNING, "IP_TOS: %m"); if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof on) < 0) syslog(LOG_WARNING, "SO_KEEPALIVE: %m"); if ((is = calloc(1, sizeof *is)) == NULL) { syslog(LOG_ERR, "calloc: %m"); (void)close(s); return; } if ((is->bev = bufferevent_new(s, icbd_dispatch, NULL, icbd_ioerr, is)) == NULL) { syslog(LOG_ERR, "bufferevent_new: %m"); (void)close(s); free(is); return; } if (bufferevent_enable(is->bev, EV_READ)) { syslog(LOG_ERR, "bufferevent_enable: %m"); (void)close(s); bufferevent_free(is->bev); free(is); return; } /* save host information */ getpeerinfo(is); /* start icb conversation */ icb_start(is); }