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

📄 tcpserver.c

📁 实时操作系统Vxworks下网络测试程序
💻 C
字号:
/*****************************************************************************************
 * 文件名:      tcpServer.c
 * 作者:         liuxq         版本: 1.0  日期: 2006-10-25
 * 文件描述:    本文件用于TCP网络测试时服务器端接收和发送任务的建立
 * 版本:        1.0
 * 函数列表:  
 * 	STATUS tcpServer();
 *	void serverWrite();
 *	void serverRead();
 *  
 * 修改历史:        
 *     <作者>   <时间>    <版本 >   <描述>
 *****************************************************************************************/
#include "vxWorks.h" 
#include "sockLib.h" 
#include "inetLib.h" 
#include "taskLib.h" 
#include "stdioLib.h" 
#include "strLib.h" 
#include "ioLib.h" 
#include "fioLib.h" 

#define SERVER_PORT_NUM         5001   /* server's port number for bind() */ 
#define SERVER_MAX_CONNECTIONS  4      /* max clients connected at a time */ 
 
void serverWrite();
void serverRead();
 
int                 newFd;         /* socket descriptor from accept */ 


/*
 * 函数名:    STATUS tcpServer (void)    
 * 函数描述:    创建服务器端套接字后等待客户端连接,连接后建立发送和接收两个任务
 * 调用:          
 * 被调用:      
 * 访问记录: 
 * 修改记录:  
 * 输入:          
 * 输出:         
 * 返回:         
 * 其它:         
 */
STATUS tcpServer (void) 
{ 
	struct sockaddr_in  serverAddr;    /* server's socket address */ 
	struct sockaddr_in  clientAddr;    /* client's socket address */ 
	int                 sockAddrSize;  /* size of socket address structure */ 
	int                 sFd;           /* socket file descriptor */ 
	int                 ix = 0;        /* counter for work task names */ 
	char                workName[16];  /* name of work task */

	sockAddrSize = sizeof (struct sockaddr_in); 
	bzero ((char *) &serverAddr, sockAddrSize); 
	serverAddr.sin_family = AF_INET; 
	serverAddr.sin_port = htons (SERVER_PORT_NUM); 
	serverAddr.sin_addr.s_addr = htonl (INADDR_ANY);

	if ((sFd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR) 
	{ 
		perror ("socket"); 
		return (ERROR); 
	}

	if (bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) == ERROR) 
	{ 
		perror ("bind"); 
		close (sFd); 
		return (ERROR); 
	}

	if (listen (sFd, SERVER_MAX_CONNECTIONS) == ERROR) 
	{ 
		perror ("listen"); 
		close (sFd); 
		return (ERROR); 
	}

	FOREVER 
	{ 
		if ((newFd = accept (sFd, (struct sockaddr *) &clientAddr, 
			&sockAddrSize)) == ERROR) 
		{ 
			perror ("accept"); 
			close (sFd); 
			return (ERROR); 
		}
		else
		{
			if ((taskSpawn("tServerWrite", 100, 0, 4096, (FUNCPTR)serverWrite, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == ERROR)
			{
				logMsg("taskSpawn tServerWrite failed!\n", 0, 0, 0, 0, 0, 0);
			}
			if ((taskSpawn("tServerRead", 100, 0, 4096, (FUNCPTR)serverRead, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == ERROR)
			{
				logMsg("taskSpawn tServerRead failed!\n", 0, 0, 0, 0, 0, 0);
			}
		}
	} 
} 


/*
 * 函数名:       void serverWrite() 
 * 函数描述:  服务器发送任务函数  
 * 调用:          write(),close(),logMsg()
 * 被调用:     tcpServer();
 * 访问记录: 
 * 修改记录:  
 * 输入:    无     
 * 输出:         无
 * 返回:         
 * 其它:         
 */
 void serverWrite()
{
	char str[100]="to client";
	
	while(1)
	{
		if (write (newFd,str,sizeof(str)) == ERROR) 
		{ 
			perror ("write"); 
			close (newFd); 
		} 
		else
		{
			logMsg("toClient=%s\n",str,0,0,0,0,0);
		}
		taskDelay(60);
	}
}

void serverRead()
{
	char str[100];
	while(1)
	{
		if (read (newFd, str, sizeof(str)) < 0) 
		{ 
			perror ("read"); 
			close (newFd); 
		}
		else
		{
			printf ("from Client:%s\n", str); 
		}
	}
}

⌨️ 快捷键说明

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