/** * 绑定iptux程序的服务监听端口. */ void bind_iptux_port() { struct sockaddr_in addr; int tcpsock, udpsock; tcpsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); socket_enable_reuse(tcpsock); udpsock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); socket_enable_reuse(udpsock); socket_enable_broadcast(udpsock); if ((tcpsock == -1) || (udpsock == -1)) { pop_error(_("Fatal Error!!\nFailed to create new socket!\n%s"), strerror(errno)); exit(1); } bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(tcpsock, (struct sockaddr *)&addr, sizeof(addr)) == -1 || bind(udpsock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { close(tcpsock); close(udpsock); pop_error(_("Fatal Error!!\nFailed to bind the TCP/UDP port(2425)!\n%s"), strerror(errno)); exit(1); } cthrd.TcpSockQuote() = tcpsock; cthrd.UdpSockQuote() = udpsock; }
/* * Send data from buffer and receive answer to the same buffer * 0 - successful, * -1 - conection lost, * -2 - invalid command or execution error. */ int pop_query_d (POP_DATA *pop_data, char *buf, size_t buflen, char *msg) { int dbg = M_SOCK_LOG_CMD; char *c; if (pop_data->status != POP_CONNECTED) return -1; #ifdef DEBUG /* print msg instaed of real command */ if (msg) { dbg = M_SOCK_LOG_FULL; dprint (M_SOCK_LOG_CMD, (debugfile, "> %s", msg)); } #endif mutt_socket_write_d (pop_data->conn, buf, -1, dbg); c = strpbrk (buf, " \r\n"); *c = '\0'; snprintf (pop_data->err_msg, sizeof (pop_data->err_msg), "%s: ", buf); if (mutt_socket_readln (buf, buflen, pop_data->conn) < 0) { pop_data->status = POP_DISCONNECTED; return -1; } if (!mutt_strncmp (buf, "+OK", 3)) return 0; pop_error (pop_data, buf); return -2; }
/* * Open connection * 0 - successful, * -1 - conection lost, * -2 - invalid response. */ int pop_connect (POP_DATA *pop_data) { char buf[LONG_STRING]; pop_data->status = POP_NONE; if (mutt_socket_open (pop_data->conn) < 0 || mutt_socket_readln (buf, sizeof (buf), pop_data->conn) < 0) { mutt_error (_("Error connecting to server: %s"), pop_data->conn->account.host); return -1; } pop_data->status = POP_CONNECTED; if (mutt_strncmp (buf, "+OK", 3)) { *pop_data->err_msg = '\0'; pop_error (pop_data, buf); mutt_error ("%s", pop_data->err_msg); return -2; } pop_apop_timestamp (pop_data, buf); return 0; }
/* ** 'discard' removes an item from the Basic stack, carrying out any ** work needed to undo the effects of that item */ static void discard(stackitem item) { basicstring temp; #ifdef DEBUG if (basicvars.debug_flags.stack) fprintf(stderr, "Drop '%s' entry at %p\n", entryname(item), basicvars.stacktop.bytesp); #endif switch(item) { case STACK_STRTEMP: temp = pop_string(); free_string(temp); break; case STACK_LOCAL: /* Restore local variable to its old value */ restore(1); break; case STACK_RETPARM: /* Deal with a 'return' parameter and restore local parameter */ restore_retparm(1); break; case STACK_GOSUB: /* Clear 'GOSUB' block from stack */ (void) pop_gosub(); break; case STACK_PROC: /* Clear 'PROC' block */ (void) pop_proc(); break; case STACK_FN: /* Clear 'FN' block */ (void) pop_fn(); break; case STACK_ERROR: /* Restore old Basic error handler */ basicvars.error_handler = pop_error(); break; case STACK_DATA: /* Restore old Basic data pointer */ basicvars.datacur = pop_data(); break; case STACK_LOCARRAY: /* Local numeric array */ basicvars.stacktop.bytesp+=entrysize[STACK_LOCARRAY]+basicvars.stacktop.locarraysp->arraysize; break; case STACK_LOCSTRING: /* Local string array */ discard_strings(basicvars.stacktop.bytesp+entrysize[STACK_LOCARRAY], basicvars.stacktop.locarraysp->arraysize); basicvars.stacktop.bytesp+=entrysize[STACK_LOCARRAY]+basicvars.stacktop.locarraysp->arraysize; break; default: if (item==STACK_UNKNOWN || item>=STACK_HIGHEST) error(ERR_BROKEN, __LINE__, "stack"); basicvars.stacktop.bytesp+=entrysize[item]; } }
/** * 发送文本消息. * @param para 消息参数 */ void DialogPeer::ThreadSendTextMsg(MsgPara *para) { Command cmd; GSList *tlist; char *ptr; int sock; tlist = para->dtlist; while (tlist) { ptr = ((ChipData *)tlist->data)->data; switch (((ChipData *)tlist->data)->type) { case MESSAGE_CONTENT_TYPE_STRING: /* 文本类型 */ cmd.SendMessage(cthrd.UdpSockQuote(), para->pal, ptr); break; case MESSAGE_CONTENT_TYPE_PICTURE: /* 图片类型 */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { pop_error(_("Fatal Error!!\nFailed to create new socket!" "\n%s"), strerror(errno)); exit(1); } cmd.SendSublayer(sock, para->pal, IPTUX_MSGPICOPT, ptr); close(sock); //关闭网络套接口 /*/* 删除此图片 */ unlink(ptr); //此文件已无用处 break; default: break; } tlist = g_slist_next(tlist); } /* 释放资源 */ delete para; }