/*---------------------------------------------------------------------------*/
/* */
/* FILE: MultiClientServer.c */
/* */
/* PURPOSE: This TCP server program allows multiple TCP clients to connect */
/* to it. The program allows the user to write to any of the */
/* connected clients. The program receives and displays any data */
/* sent by the clients. The program uses worker threads to manage */
/* reading and writing to each client. You can use the TCP client */
/* sample program to interact with this server. */
/* */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Include files */
/*---------------------------------------------------------------------------*/
#include <tcpsupp.h>
#include <ansi_c.h>
#include <utility.h>
#include <toolbox.h>
#include "MultiClientServer.h"
/*---------------------------------------------------------------------------*/
/* Macros and constants */
/*---------------------------------------------------------------------------*/
#define SERVER_PORT_NUM 10000
#define tcpChk(f) if ((tcpErr=(f))<0) {ReportTCPError(tcpErr); goto Done;} else
/*---------------------------------------------------------------------------*/
/* Type definitions */
/*---------------------------------------------------------------------------*/
typedef struct ClientInfo
{
unsigned int handle; /* TCP conversation handle */
unsigned int threadId; /* ID of worker thread */
int threadFuncId; /* ID of worker thread function */
int stopFlag; /* Flag used to stop worker thread */
char name[256]; /* Descriptive name of client connection */
int readingData; /* Indicates server is reading from client */
int panel; /* Handle of panel to display client data */
} ClientInfo, *ClientInfoPtr;
/*---------------------------------------------------------------------------*/
/* Module-globals */
/*---------------------------------------------------------------------------*/
static int gPanel = 0; /* Main user interface panel handle */
static ListType gClientList = 0; /* List of connected clients */
/*---------------------------------------------------------------------------*/
/* Internal function prototypes */
/*---------------------------------------------------------------------------*/
static int ConnectClient (unsigned int handle);
static int DisconnectClient (unsigned int handle);
static int Disconnect (ClientInfoPtr clientInfoPtr, int index, int removeFromList);
static int CVICALLBACK ClientThreadFunction (void *data);
static int CVICALLBACK CompareClientInfoPtr (void *item1, void *item2);
static int CVICALLBACK DisconnectClientListItem (int index, void *itemPtr,
void *data);
static int CVICALLBACK ServerCallback (unsigned int handle, int xType,
int errCode, void *cbData);
static void CVICALLBACK DeferredSend (void *data);
static void CVICALLBACK DeferredReceive (void *data);
static void ReportTCPError (int error);
/*---------------------------------------------------------------------------*/
/* This is the application's entry-point. */
/*---------------------------------------------------------------------------*/
int main (int argc, char *argv[])
{
int tcpErr = 0;
int unregisterServer = 0;
if (InitCVIRTE(0, argv, 0) == 0)
return -1;
/* Load user interface */
if ((gPanel = LoadPanel (0, "MultiClientServer.uir", PANEL)) < 0)
return -1;
/* Create list to manage client connections */
gClientList = ListCreate (sizeof (ClientInfoPtr));
/* Register the server */
tcpChk (RegisterTCPServer (SERVER_PORT_NUM, ServerCallback, NULL));
unregisterServer = 1;
DisplayPanel (gPanel);
RunUserInterface ();
/* Clean up */
if (gClientList)
{
ListApplyToEach (gClientList, 0, DisconnectClientListItem, 0);
ListDispose (gClientList);
}
Done:
if (unregisterServer)
UnregisterTCPServer (SERVER_PORT_NUM);
DiscardPanel (gPanel);
return 0;
}
/*---------------------------------------------------------------------------*/
/* Respond to the panel closure to quit the UI loop. */
/*---------------------------------------------------------------------------*/
int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
/*---------------------------------------------------------------------------*/
/* Send data to connected client. */
/*---------------------------------------------------------------------------*/
int CVICALLBACK SendCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
ClientInfoPtr clientInfoPtr = NULL;
switch (event)
{
case EVENT_COMMIT:
/*
* Get current client from listbox, and post the call
* to its worker thread.
*/
GetCtrlVal (gPanel, PANEL_CLIENT_LIST, (int *)(&clientInfoPtr));
PostDeferredCallToThread (DeferredSend, clientInfoPtr,
clientInfoPtr->threadId);
break;
}
return 0;
}
/*---------------------------------------------------------------------------*/
/* Disconnect a client. */
/*---------------------------------------------------------------------------*/
int CVICALLBACK DisconnectCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
ClientInfoPtr clientInfoPtr = NULL;
int index;
switch (event)
{
case EVENT_COMMIT:
/* Get current client from listbox. */
GetCtrlVal (gPanel, PANEL_CLIENT_LIST, (int *)&clientInfoPtr);
/* Find the index of the client in the client list. */
index = ListFindItem (gClientList, &clientInfoPtr,
FRONT_OF_LIST, CompareClientInfoPtr);
/* Disconnect the client. */
if (index > 0)
Disconnect (clientInfoPtr, index, 1);
break;
}
return 0;
}
/*---------------------------------------------------------------------------*/
/* Worker thread function for clients. */
/*---------------------------------------------------------------------------*/
static int CVICALLBACK ClientThreadFunction (void *data)
{
ClientInfoPtr clientInfoPtr = (ClientInfoPtr) data;
clientInfoPtr->threadId = CmtGetCurrentThreadID ();
/* Load a new panel for this client message. */
clientInfoPtr->panel = LoadPanel (0, "MultiClientServer.uir",
没有合适的资源?快使用搜索试试~ 我知道了~
tcp.rar_CVI 网络_CVI的TCP编程_LabWindows TCP/IP _cvi 网络编程_labwindows
共45个文件
h:7个
c:7个
uir:7个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 51 浏览量
2022-09-20
19:03:39
上传
评论
收藏 370KB RAR 举报
温馨提示
此代码Labwindows/CVI实现TCP/IP网络编程
资源详情
资源评论
资源推荐
收起资源包目录
tcp.rar (45个子文件)
tcp
MultiThreadingServer.c 6KB
MessageReader.c 7KB
server.c 11KB
MultiThreadingClient.c 10KB
MessageWriter.h 1KB
MultiClientServer.cws 119B
MessageReader.prj 3KB
client.prj 3KB
cvibuild.client
build.ini 1KB
dependencies.bri 4B
client.nidobj 99KB
resources.res 5KB
cvibuild.server
build.ini 1KB
server.nidobj 107KB
dependencies.bri 4B
resources.res 5KB
server.h 2KB
client.cws 3KB
Message.cws 153B
MultiThreadingClient.uir 3KB
MultiClientServer.uir 4KB
server.cws 3KB
client.h 2KB
client.uir 5KB
MessageReader.uir 3KB
server.uir 5KB
client.c 9KB
client_dbg.cdb 756KB
MessageWriter.prj 3KB
MessageWriter.c 8KB
MultiThreadingServer.uir 2KB
server_dbg.exe 243KB
MultiThreadingClient.h 2KB
MultiClientServer.h 2KB
MultiClientServer.c 19KB
server_dbg.cdb 759KB
MultiClientServer.prj 4KB
MultiThreading.cws 165B
MultiThreadingServer.h 1KB
client_dbg.exe 240KB
MultiThreadingServer.prj 3KB
MessageWriter.uir 3KB
server.prj 3KB
MultiThreadingClient.prj 3KB
MessageReader.h 1KB
共 45 条
- 1
周楷雯
- 粉丝: 78
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3