📄 soctcp.c
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -