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

📄 tcpserver.c

📁 这是我上期在TORNADO下写的基于VXWORKS嵌入式操作系统的TCP/IP通信程序的源代码
💻 C
字号:
/* tcpServer.c - TCP server example */ 
#include "vxWorks.h" 
#include "sockLib.h" 
#include "inetLib.h" 
#include "taskLib.h" 
#include "stdioLib.h" 
#include "strLib.h" 
#include "ioLib.h" 
#include "fioLib.h" 
#include "tcp.h" 

void tcpServerWorkTask (int sFd, char * address, u_short port); 
STATUS tcpServer (void);

STATUS test()
{
	/*将tcpServer任务放置于后台执行*/
	taskSpawn("tcpServer",110,0,10000,(FUNCPTR)tcpServer,0,0,0,0,0,0,0,0,0,0);
	return OK;
}

STATUS tcpServer (void) 
{ 
    struct sockaddr_in  serverAddr;   
    struct sockaddr_in  clientAddr;   
    int                 sockAddrSize; 
    int                 sFd;          
    int                 newFd;         /* socket descriptor from accept */ 
    int                 ix = 0;        /* counter for work task names */ 
    char                workName[16];  /* 建立的任务名称 */ 
    
    sockAddrSize = sizeof (struct sockaddr_in); 
    bzero ((char *) &serverAddr, sockAddrSize); 
    
    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_len = (u_char) sockAddrSize; 
    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 error \n"); 
        close (sFd); 
        return (ERROR); 
        }
    
    if (listen (sFd, SERVER_MAX_CONNECTIONS) == ERROR) 
        { 
        perror ("listen establish error \n"); 
        close (sFd); 
        return (ERROR); 
        }/*建立失败返回错误信息*/
        
    FOREVER 
        { 
        if ((newFd = accept (sFd, (struct sockaddr *) &clientAddr, 
            &sockAddrSize)) == ERROR) 
            { /*判断是否有信息传输,若建立失败,返回错误信息*/
            perror ("accept error \n"); 
            close (sFd); 
            return (ERROR); 
            }
 	printf("sFd = %d; newFd = %d \n",sFd,newFd);
        sprintf (workName, "tTcpWork%d", ix++); 
        if (taskSpawn(workName, SERVER_WORK_PRIORITY, 0, SERVER_STACK_SIZE, 
            (FUNCPTR) tcpServerWorkTask, newFd, 
            (int) inet_ntoa (clientAddr.sin_addr), ntohs (clientAddr.sin_port), 
            0, 0, 0, 0, 0, 0, 0) == ERROR) 
            { 
            /* 调用函数,发起一个新的任务,错误返回错误信息*/ 
            perror ("taskSpawn"); 
            close (newFd); 
            } 
        } 
}  

void tcpServerWorkTask /*被调用的函数*/
/*在建立的循环中,如果套节字的字长大于0,读取数据,反之退出*/
	( 
    int                 sFd,           
    char *              address,        
    u_short             port           
    ) 
{ 
    struct request      clientRequest;   
    int                 nRead;        
    static char         replyMsg[] = "Server received your message"; 
    while ((nRead = fioRead (sFd, (char *) &clientRequest, 
        sizeof (clientRequest))) > 0) 
        { 
        printf ("MESSAGE FROM CLIENT (Internet Address %s, port %d):\n%s\n", 
                 address, port, clientRequest.message); 
        free (address);              
        if (clientRequest.reply) 
            if (write (sFd, replyMsg, sizeof (replyMsg)) == ERROR) 
                perror ("write"); 
        } 
    if (nRead == ERROR)             
        perror ("read"); 
    close (sFd);                   
}

⌨️ 快捷键说明

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