./ MultiCS.r82 / msg-radegast.c
#include "common.h" #include <stdio.h> #include <string.h> #include <stdarg.h> #include <unistd.h> #ifdef WIN32 #include <windows.h> #include <sys/types.h> #include <sys/_default_fcntl.h> #include <sys/poll.h> #include <cygwin/types.h> #include <cygwin/socket.h> #include <sys/errno.h> #include <cygwin/in.h> #include <sched.h> #include <netdb.h> #include <netinet/tcp.h> #else #include <sys/types.h> #include <sys/socket.h> #include <signal.h> #include <netdb.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #endif #include "debug.h" #include "sockets.h" #include "msg-radegast.h" /////////////////////////////////////////////////////////////////////////////// int rdgd_message_receive(int sock, unsigned char *buffer, int timeout) { int len; unsigned char netbuf[300]; if (sock==INVALID_SOCKET) { return -1; } len = recv_nonb(sock, netbuf, 2,timeout); if (len<=0) { return len; // disconnected } if (len != 2) { return -1; } len = recv_nonb(sock, netbuf+2, netbuf[1],timeout); if (len<=0) { return len; // disconnected } if (len != netbuf[1]) { return -1; } len += 2; #ifdef DEBUG_NETWORK if (flag_debugnet) { debugf(0," radegast: receive data %d\n",len); debughex(netbuf,len); } #endif memcpy(buffer, netbuf, len); return len; } /////////////////////////////////////////////////////////////////////////////// int rdgd_message_send(int sock, unsigned char *buf, int len) { #ifdef DEBUG_NETWORK if (flag_debugnet) { debugf(0," radegast: send data %d\n",len); debughex(buf,len); } #endif return send_nonb( sock, buf, len, 100); } /////////////////////////////////////////////////////////////////////////////// // -1: not yet // 0: disconnect // >0: ok int rdgd_check_message(int sock) { int len; unsigned char netbuf[300]; len = recv(sock, netbuf, 2, MSG_PEEK|MSG_NOSIGNAL|MSG_DONTWAIT); if (len==0) return 0; if (len!=2) return -1; int datasize = netbuf[1]; len = recv(sock, netbuf, 2+datasize, MSG_PEEK|MSG_NOSIGNAL|MSG_DONTWAIT); if (len!=2+datasize) return -1; return len; }