⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charsock.c

📁 这是一个Socket编程的应用,包括SOCKET建立,读写,关闭等操作,可以使用.可以建立服务器端,也可以建立客户端.
💻 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 + -