www.pudn.com > spy_pass.zip > tcp.cpp
#include#include #include #include #include "tcp.h" int wsa_ok =0, err_no =0; void peek_message(void); int get_local_ip(char *ip); int tcp_init() { WSAData wsa; //sd_bind =sd_connect =sd_accept =-1; if(WSAStartup(MAKEWORD(1, 1), &wsa) !=0) return -1; wsa_ok =1; return 0; } int tcp_exit() { if(wsa_ok) WSACleanup(); return 0; } int tcp_status(int sd, char *type, int timeout) { fd_set rset, wset, eset; fd_set FAR *prset =NULL, *pwset =NULL, *peset =NULL; struct timeval tval; int i, status, err_no =0; time_t t1, t2; MSG msg; tval.tv_sec =0; tval.tv_usec =0; time(&t1); t2 =t1; while(t2-t1 < timeout) { FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset); for(i =0; i<(int)strlen(type); i++) { if(type[i] =='r') { FD_SET(sd, &rset); prset =&rset; } if(type[i] =='w') { FD_SET(sd, &wset); pwset =&wset; } if(type[i] =='e') { FD_SET(sd, &eset); peset =&eset; } } status =select(-1/*sd+1*/, prset, pwset, peset, &tval); time(&t2); if(status ==0) { if(PeekMessage(&msg, 0, NULL, NULL, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if(msg.message ==WM_QUIT) return -1; } if(t2-t1 h_addr, hp->h_length); } else addr.sin_addr.s_addr=ul; addr.sin_family =AF_INET; addr.sin_port =htons((unsigned short)port); l =1; if(f_noblock && ioctlsocket(sd, FIONBIO, (unsigned long *)&l) <0) { closesocket(sd); return -1; } /*if(setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (char *)&l, sizeof(l)) <0) { closesocket(sd); return -1; }*/ time(&t1); while((ret =connect(sd, (struct sockaddr *)&addr, sizeof(addr))) !=0) { time(&t2); if((t2 -t1) > timeout) { closesocket(sd); return -1; } peek_message(); int err_no =WSAGetLastError(); if(ret ==SOCKET_ERROR) { if(err_no ==WSAEISCONN) break; } else if(err_no ==WSAEWOULDBLOCK /*|| err_no ==WSAEINPROGRESS*/ || err_no ==WSAEALREADY) { continue; } else { closesocket(sd); return -1; } } if(tcp_status(sd, "we", timeout) <0) { sprintf(temp, "status:连接服务器失败!\n检查服务器端程序是否运行\n且主机地址是否%s, 端口是否%d\n" "errno=%d", hostname, port, WSAGetLastError()); closesocket(sd); return -1; } //sd_connect =sd; return sd; } void tcp_close(int sd) { tcp_disconnect(sd); } void tcp_disconnect(int sd) { if(sd >0) { closesocket(sd); //if(sd ==sd_connect) sd_connect =-1; //if(sd ==sd_accept) sd_accept =-1; //if(sd ==sd_bind) sd_bind =-1; } } int tcp_send(int sd, char *buf, int len, int timeout) { int len1, len_send =0; time_t t1, t2; len_send =0; time(&t1); t2 =t1; while(len_send timeout) return len_send; if(tcp_status(sd, "w", timeout-(t2-t1)) <0) return len_send; if((len1 =send(sd, &buf[len_send], len-len_send, 0)) <=0) { err_no =GetLastError(); if(len1 ==SOCKET_ERROR && err_no ==WSAEWOULDBLOCK) { time(&t2); continue; } return len_send; } len_send +=len1; time(&t2); } return len_send; } int tcp_recv(int sd, char *buf, int len, int timeout) { int len1, len_recv; time_t t2, t1; len_recv =0; time(&t1); t2 =t1; while(len_recv timeout) return len_recv; if(tcp_status(sd, "r", timeout-(t2-t1)) <0) return len_recv; if((len1 =recv(sd, &buf[len_recv], len-len_recv, 0)) <=0) { err_no =GetLastError(); if(timeout ==0) break; if(len1 ==SOCKET_ERROR && err_no ==WSAEWOULDBLOCK) { time(&t2); continue; } return len_recv; } len_recv +=len1; time(&t2); } return len_recv; } int tcp_gethostnamebyip(char *ip, char *host) { struct hostent *hp; struct in_addr ul; host[0] =0; ul.S_un.S_addr =inet_addr(ip); if(ul.S_un.S_addr ==0xFFFFFFFF) return -1; // ip error or ip is hostname hp =gethostbyaddr((char *)&ul, 4, AF_INET); if(hp ==NULL) return -1; // can not get hostname strcpy(host, hp->h_name); return 0; } int get_local_ip(char *ip) { struct hostent *hp; char host[50], *p; if(gethostname(host, sizeof(host)) <0) return -1; hp =gethostbyname(host); if(hp ==NULL) return -1; p =(char *)hp->h_addr; wsprintf(ip, "%d.%d.%d.%d", (int)p[0]&0xFF, (int)p[1]&0xFF, (int)p[2]&0xFF, (int)p[3]&0xFF); return 0; } char *get_remote_ip(int sd, char *ip) { struct sockaddr_in addr_in; int len =sizeof(addr_in); char *p1; if(sd <0) return NULL; if(getpeername(sd, (struct sockaddr *)&addr_in, &len) <0) return NULL; p1 =(char *)&addr_in.sin_addr; sprintf(ip, "%d.%d.%d.%d", ((int)p1[0]) &0xff, ((int)p1[1]) &0xff, (int)p1[2] &0xff, (int)p1[3]&0xff); return ip; } unsigned short tcp_htons(unsigned short s) { return htons(s); } unsigned short tcp_ntohs(unsigned short s) { return ntohs(s); } unsigned long int tcp_htonl(unsigned long int l) { return htonl(l); } unsigned long int tcp_ntohl(unsigned long int l) { return ntohl(l); } float tcp_htonf(float f) { unsigned char *p, p0, p1; if(htons(1) ==1) return f; p =(unsigned char *)&f; p0 =p[0]; p1 =p[1]; p[0] =p[3]; p[3] =p0; p[1] =p[2]; p[2] =p1; return f; } float tcp_ntohf(float f) { unsigned char *p, p0, p1; if(ntohs(1) ==1) return f; p =(unsigned char *)&f; p0 =p[0]; p1 =p[1]; p[0] =p[3]; p[3] =p0; p[1] =p[2]; p[2] =p1; return f; } double tcp_htond(double d) { unsigned char *p, p0, p1, p2, p3; if(htons(1) ==1) return d; p =(unsigned char *)&d; p0 =p[0]; p1 =p[1]; p2 =p[2]; p3 =p[3]; p[0] =p[7]; p[7] =p0; p[1] =p[6]; p[6] =p1; p[2] =p[5]; p[5] =p2; p[3] =p[4]; p[4] =p3; return d; } double tcp_ntohd(double d) { unsigned char *p, p0, p1, p2, p3; if(ntohs(1) ==1) return d; p =(unsigned char *)&d; p0 =p[0]; p1 =p[1]; p2 =p[2]; p3 =p[3]; p[0] =p[7]; p[7] =p0; p[1] =p[6]; p[6] =p1; p[2] =p[5]; p[5] =p2; p[3] =p[4]; p[4] =p3; return d; } void peek_message(void) { MSG msg; if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } }