soctcp.c

来自「一个ftp服务器程序」· C语言 代码 · 共 93 行

C
93
字号
#include "ftpdaemon.h"int socket_stat( int sock, int tmval ){    fd_set readmask;    struct timeval tv, *ptv = NULL;    int bytes=0;    FD_ZERO( &readmask );    FD_SET( sock, &readmask );    memset( &tv, 0, sizeof(struct timeval) );    if ( tmval >= 0 ) {        tv.tv_sec	= tmval;        ptv		= &tv;    }#ifdef SCO5    switch ( select(sock+1, (fd_set*)&readmask, (fd_set*)0, (fd_set*)0, ptv) ) {#else    switch ( select(sock+1, (int*)&readmask, (int*)0, (int*)0, ptv) ) {#endif        case 0: /* socket normal */            return SS_TIMEDOUT;        case -1: /* socket abnormal */	    FTPLOG("select() return -1");            return SS_BAD;        default: /* socket has event occur */            if ( ioctl(sock, FIONREAD, &bytes) < 0 ) {                return SS_BAD;            }            else                if ( bytes < 0 ) {                    return SS_CLOSED;                }                else                    return SS_READABLE;    }}int send_nbytes( int sock, char *buf, int len ){    int left=len, cnt, sended=0;    while ( left > 0 )        switch ( socket_stat(sock, 0) ) {            case SS_TIMEDOUT:            case SS_READABLE:                if ( (cnt=send(sock, buf+sended, left, 0)) <= 0 ) {		    FTPLOG("[%s:%d] send() error",CurrFILE, CurrLINE);                    return E_FAIL;                }                left   -= cnt;                sended += cnt;                break;            case SS_BAD:            case SS_CLOSED:                return E_FAIL;        }    return E_SUCC;}int recv_nbytes( int sock, char *buf, int len, int tmot ){    int left=len, cnt, readed=0;    while ( left > 0 )        switch ( socket_stat(sock, tmot) ) {            case SS_READABLE:                if ( (cnt=recv(sock, buf+readed, left, 0)) <= 0 ) {		    FTPLOG("[%s:%d] recv() fail",CurrFILE, CurrLINE);                    return E_FAIL;                }                left   -= cnt;                readed += cnt;                break;            case SS_TIMEDOUT:            case SS_BAD:            case SS_CLOSED:                return E_FAIL;        }    return E_SUCC;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?