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

📄 tcpserver.c

📁 2410/vxworks/tornado下的基本实验包括 serial,ramdrv,interrupt,multi-tasking,FTP,TCP,UDP
💻 C
字号:
/*tcpServer.c - TCP 服务器 端程序*/


/* includes */

#include "vxWorks.h"
#include "sockLib.h"
#include "inetLib.h"
#include "stdioLib.h"
#include "strLib.h"
#include "hostLib.h"
#include "ioLib.h"
#include "tcpExample.h"
/*函数声明*/
void tcpserverWorkFunc(int sFd, char* address, u_short port);


/*********************************************************************
*
*tcpServer -- 接收并处理通过TCP套接字发送的请求
*本函数生成一个TCP套接字用以接收客户端的套接字连接。
*每个客户端的连接都由一个新生成的任务来处理
*
*返回值: ERROR 或 不返回
*
***********************************************************************/

STATUS tcpServer(void)
{
	struct sockaddr_in serverAddr;          /*服务器套接字地址*/
	struct sockaddr_in clientAddr;           /*客户端套接字地址*/
	struct REQUEST clientRequest;         /*客户端的请求和信息*/
	int sockAddrSize;                              /*套接字地址数据结构大小*/
	int sFd;                                              /*套接字文件描述符*/
	int newFd;                                         /*接收的套接字描述符*/                          
	int ix = 0;                                          /*工作任务计数*/
	char workName[16];                         /*工作任务名*/
	
	/*设置本地地址*/

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

	/*生成TCP套接字*/

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

	/*绑定套接字*/
	if(bind(sFd,(struct sockaddr *)&serverAddr, sockAddrSize) == ERROR)
		{
			perror("bind \n");
			close(sFd);
			return(ERROR);
		}

	/*生成客户端请求连接队列*/
	if(listen(sFd, SERVER_MAX_CONNECTIONS) == ERROR)
		{
			perror("listen \n");
			close(sFd);
			return(ERROR);
		}
	

	/*接收连接请求并生成一个新的任务来处理请求*/

	FOREVER
		{
			if((newFd = accept(sFd, (struct sockaddr*)&clientAddr, &sockAddrSize)) == ERROR)
				{
					perror("accept \n");
					close(sFd);
					return(ERROR);
				}
			tcpserverWorkFunc(newFd, (int)inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
		}
	
}



/**************************************************************************************
* tcpserverWorkFunc --处理客户端请求
* 本函数从服务器套接字中读取客户端请求信息并加以处理。
*
* 参数:
* sFd                   建立连接的套接字
* address            客户端套接字地址
* port                  客户端套接字端口
*
* 返回值: 无
*
*
****************************************************************************************/

void tcpserverWorkFunc(int sFd, char * address, u_short port)
{
	struct REQUEST clientRequest;
	int nRead;
	const char replyMsg[] = "Server received your message";

	/*读取客户端请求,并显示信息*/
	while((nRead = recv(sFd, (char*)&clientRequest, sizeof(clientRequest),0)) > 0)
		{
			printf("Message from Client(IP Address%s, port %d) : \n%s\n",
				address,port,clientRequest.message);

			/*若客户端要求服务器返回信息*/
			if(clientRequest.reply)
				{
					if((send(sFd, replyMsg, sizeof(replyMsg), 0)) == ERROR)
						perror("send \n");
				}
			
		}

	/*recv错误*/
	if(nRead == ERROR)
			perror("recv \n");
		
	free(address);		/*释放由inet_ntoa分配的内存*/
	
	close(sFd);				/*关闭服务器套接字连接*/
	
}

⌨️ 快捷键说明

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