📄 tcpserver.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 + -