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

📄 uniontcpipsvr.c

📁 这是个unix环境下的通讯程序
💻 C
字号:
/*	socket通讯中,若客户端和服务器建立长链接,服务器程序关闭链接,终止进程后,	若客户端没有关闭该链接,则不能重新启动服务器程序,bind函数调用失败。	在服务器程序的accept函数调用之后增加语句,即使客户端没有关闭链接,	服务器程序也可以主动关闭socket链接,重新启动。*/#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <arpa/inet.h>#ifndef _UnionSocket_2_x_#define _UnionSocket_2_x_#endif#define _UnionTask_2_x_#include "UnionSocket.h"int UnionTCPIPServer(int port,char *ServerName,int (*UnionTCPIPTaskServer)()){	struct sockaddr_in	serv_addr;	int			scksvr;	struct sockaddr_in	cli_addr;	int			sckinstance;	int			clilen;	char			cliip[40];	int			ret;	struct linger		Linger;	// Added by Wolfgang Wang, 2003/02/26		// Initialize the socket	memset((char *)(&serv_addr), 0,sizeof(struct sockaddr_in));	serv_addr.sin_family            = AF_INET;	serv_addr.sin_addr.s_addr       = htonl(INADDR_ANY);	serv_addr.sin_port = htons((u_short)port);	if ((scksvr = socket(AF_INET, SOCK_STREAM, 0)) < 0)	{		UnionSystemErrLog("in UnionTCPIPServer:: socket()!\n");		return(UnionErrCallingSocket);	}	if (bind(scksvr,(struct sockaddr *)(&serv_addr),sizeof(struct sockaddr_in)) < 0)	{		UnionSystemErrLog("in UnionTCPIPServer:: bind()!\n");		return(UnionErrCallingBind);	}	// Listen to new-coming connecting request	if ( listen(scksvr, 10000) < 0 )	{		UnionSystemErrLog("in UnionTCPIPServer:: listen()!\n");		return(UnionErrCallingListen);	}	if (UnionCreateProcess() > 0)		return(0);	UnionRegisterTask("%s %d",ServerName,port);	UnionSuccessLog("in UnionTCPIPServer:: %s %d is started OK!\n",ServerName,port);				for (;;)	{		// Accept a Client's Connecting reqeust.		clilen = sizeof(cli_addr);		sckinstance = accept(scksvr, (struct sockaddr *)&cli_addr,&clilen);		if ( sckinstance < 0 )		{			UnionSystemErrLog("in UnionTCPIPServer:: accept()!\n");			continue;		}				// Added by Wolfgang Wang, 2003/02/26		Linger.l_onoff = 1;		Linger.l_linger = 0;		if (setsockopt(sckinstance,SOL_SOCKET,SO_LINGER,(char *)&Linger,sizeof(Linger)) != 0)		{			UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt linger!");			close(sckinstance);			return(UnionErrCallingSetsockopt);		}		// End of Addition of 2003/02/26				// Create a new process or a new thread, one of the two process is listening		// to other connecting request from clients, whereas the other is to fulfill		// the task and return a response to the connected client, when necessary.		// When the task process finish fulfiling the task, it should terminate itself		// automatically.	    	switch (UnionCreateProcess())		{			case 0:				UnionRegisterTask("%s %d",ServerName,port);				UnionCloseSocket(sckinstance);				continue;			case -1:				UnionUserErrLog("in UnionTCPIPServer:: UnionCreateProcess!\n");				UnionCloseSocket(sckinstance);				continue;			default:				UnionUnregisterTask();				if ( (ret = (*UnionTCPIPTaskServer)(sckinstance,inet_ntoa(cli_addr.sin_addr),port)) != 0)					UnionUserErrLog("in UnionTCPIPServer:: UnionTCPIPTaskServer!\n");				UnionCloseSocket(sckinstance);				return(ret);		}				    	}}

⌨️ 快捷键说明

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