?? charsock.c
字號:
#include <stdlib.h>#include <stdio.h>#include <sys/ioctl.h>#include <sys/filio.h>#include <sys/errno.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/time.h>#include <sys/types.h>#include <fcntl.h>#include <sys/errno.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include "term.h"#include "charsock.hpp"extern int errno;Boolean charsocket;TCHARSOCKET::TCHARSOCKET(char *hostname,int port){ state = Exit; strcpy(name,hostname); portNumber = port; sockWait = -99; iofd = -1; addressInUse = False;}TCHARSOCKET::~TCHARSOCKET(){ closes();}Boolean TCHARSOCKET::openServer(){int length; sockType = Service; sockWait=socket(AF_INET,SOCK_STREAM,0); if(sockWait<0) { term(ToLogFile,"cann't open char server socket\n"); sockWait=-99; return False; } if(fcntl(sockWait,F_SETFL,FNDELAY)<0) { term(ToLogFile,"fcntl server socket error\n"); close(sockWait); sockWait=-99; return False; } setReuseAddr(); server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=portNumber; if(bind(sockWait,(struct sockaddr*)&server,sizeof server)<0) { term(ToWriteTerm,"!!!!char socket cann't binding for waitting\n"); addressInUse = True; return False; } length = sizeof server; if(getsockname(sockWait,(struct sockaddr*)&server,&length)<0) { close(sockWait); term(ToWriteTerm,"cann't get server socket name\n"); return False; } term(ToLogFile,"open char socket port = %d\n",ntohs(server.sin_port)); listen(sockWait,QueueLength); return(waitForConnect());}Boolean TCHARSOCKET::waitForConnect(){ if(state == Run)return True; if(addressInUse == True) { if(bind(sockWait,(struct sockaddr*)&server,sizeof server)<0) { term(ToWriteTerm,"!!!! char socket cann't binding again, waitting...\n"); return False; } else { addressInUse = False; int length; length = sizeof server; if(getsockname(sockWait,(struct sockaddr*)&server,&length)<0) { close(sockWait); sockWait = -99; return False; } listen(sockWait,QueueLength); } } iofd = accept(sockWait,(struct sockaddr*)0,(int *)0); if(iofd > 0) { setReuseAddr(); state = Run; return(True); } // term(ToWriteTerm,"accept is failure in socket.C \n"); return False;}Boolean TCHARSOCKET::openClient(){ sockType = Client; iofd=socket(AF_INET,SOCK_STREAM,0); if(iofd<0) { term(ToLogFile,"cann't opening client socket"); close(iofd); iofd = -1; return False; } hp=gethostbyname(name); if(hp==0) { term(ToLogFile,"unknow host of inet"); close(iofd); iofd=-1; return False; } server.sin_family=AF_INET; memcpy((struct sockaddr*)&server.sin_addr,(char*)hp->h_addr,hp->h_length); server.sin_port=portNumber; int err = connect(iofd,(struct sockaddr*)&server,sizeof server); term(ToWriteTerm,"%s\n",((err>=0 || errno==EINPROGRESS) ? "connect successs" : "connect failed")); Boolean result=(err>=0 || errno==EINPROGRESS ? True : False); if(fcntl(iofd,F_SETFL,FNDELAY)<0) { term(ToWriteTerm,"fcntl client socket\n"); close(iofd); iofd=-99; return False; } if( result == True )state = Run; else { close(iofd); iofd = -1; } return result;}void TCHARSOCKET::setReuseAddr(){ int reuseAddrFlag=1; int reuseAddrSize=sizeof reuseAddrFlag; if(setsockopt(sockWait,SOL_SOCKET,SO_REUSEADDR,(char *)&reuseAddrFlag,reuseAddrSize)<0) term(ToLogFile,"!!!!! Error :set reuse:\n");}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -