题记:
我下面的帖的代码是 服务器 端,下面称呼客户端为 客户 。
1。首先由客户 发"R_MNG_REQ"字符串,服务器若成功接收就回传 字符串"R_MNG_ACK OK"2。若 1。成功,则客户发字符串"R_LINK_REQ",服务器回传 字符串"R_LINK_REPORT\r\n"。3。若 1。成功,则客户每隔60秒给服务器发字符串"ACTIVE\r\n"。下面是我写的服务器代码,我专门起了一个线程来接收字符串"ACTIVE\r\n",但等了好长时间都没收到"ACTIVE\r\n",为什么?代码如下:#pragma comment (lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>#define TOA_COMMAND_START "R_MNG_REQ"
#define TOA_COMMAND_MNG_ACK_OK "R_MNG_ACK OK"
#define TOA_COMMAND_MNG_ACK_NG "R_MNG_ACK NG"
#define TOA_COMMAND_GET_STATUS "R_LINK_REQ"
#define TOA_LINK_REPORT "R_LINK_REPORT\r\n"
#define TOA_COMMAND_ACTIVE "ACTIVE\r\n"DWORD WINAPI testActive(
LPVOID lpparameter
);void main()
{
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
char recvBuf[100] ;
memset(recvBuf,0,100); wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
} if (LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2)
{
WSACleanup( );
return;
} // 创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5001); // 绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// 将套接字设为监听模式,准备接收客户请求
listen(sockSrv, 5); SOCKADDR_IN service;
int len = sizeof(SOCKADDR); // 心跳指令
HANDLE hThread;
hThread = CreateThread(NULL, 0, testActive, NULL, 0, NULL);
CloseHandle(hThread); while(1)
{
// 等待客户请求到来
SOCKET sockConn=accept(sockSrv, (SOCKADDR*)&service,&len); // 接收数据
recv(sockConn, recvBuf, 100, 0);
printf("%s", recvBuf);
// system("pause"); // 如果接收到 R_MNG_REQ 则返回一个 R_MNG_ACK OK
if(!memcmp(recvBuf,TOA_COMMAND_START,strlen(TOA_COMMAND_START)))
{
send(sockConn, TOA_COMMAND_MNG_ACK_OK, strlen(TOA_COMMAND_MNG_ACK_OK)+1, 0);
} // 接收数据
recv(sockConn, recvBuf, strlen(recvBuf), 0);
printf("%s", recvBuf); // 如果接收到 R_LINK_REQ 则返回一个 R_LINK_REPORT\r\n
if(!memcmp(recvBuf,TOA_COMMAND_GET_STATUS,strlen(TOA_COMMAND_GET_STATUS)))
{
send(sockConn, TOA_LINK_REPORT, strlen(TOA_LINK_REPORT)+1,0);
}
// 关闭套接字
// closesocket(sockConn);
}
}DWORD WINAPI testActive(
LPVOID lpparameter
)
{
char recvBuf[100];
memset(recvBuf,0,100); printf("新线程\n"); // 创建用于监听ACTIVE命令的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5001); // 绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); // 将套接字设为监听模式,准备接收客户请求
listen(sockSrv, 5); SOCKADDR_IN service;
int len = sizeof(SOCKADDR); while(1)
{
// 等待客户请求到来
SOCKET sockConn=accept(sockSrv, (SOCKADDR*)&service,&len);
// 接收数据
recv(sockConn, recvBuf, 100, 0);
if(!memcmp(recvBuf,TOA_COMMAND_ACTIVE,strlen(TOA_COMMAND_ACTIVE)))
{
printf("%s", recvBuf);
}
} return 0;
}
我下面的帖的代码是 服务器 端,下面称呼客户端为 客户 。
1。首先由客户 发"R_MNG_REQ"字符串,服务器若成功接收就回传 字符串"R_MNG_ACK OK"2。若 1。成功,则客户发字符串"R_LINK_REQ",服务器回传 字符串"R_LINK_REPORT\r\n"。3。若 1。成功,则客户每隔60秒给服务器发字符串"ACTIVE\r\n"。下面是我写的服务器代码,我专门起了一个线程来接收字符串"ACTIVE\r\n",但等了好长时间都没收到"ACTIVE\r\n",为什么?代码如下:#pragma comment (lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>#define TOA_COMMAND_START "R_MNG_REQ"
#define TOA_COMMAND_MNG_ACK_OK "R_MNG_ACK OK"
#define TOA_COMMAND_MNG_ACK_NG "R_MNG_ACK NG"
#define TOA_COMMAND_GET_STATUS "R_LINK_REQ"
#define TOA_LINK_REPORT "R_LINK_REPORT\r\n"
#define TOA_COMMAND_ACTIVE "ACTIVE\r\n"DWORD WINAPI testActive(
LPVOID lpparameter
);void main()
{
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
char recvBuf[100] ;
memset(recvBuf,0,100); wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
} if (LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2)
{
WSACleanup( );
return;
} // 创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5001); // 绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// 将套接字设为监听模式,准备接收客户请求
listen(sockSrv, 5); SOCKADDR_IN service;
int len = sizeof(SOCKADDR); // 心跳指令
HANDLE hThread;
hThread = CreateThread(NULL, 0, testActive, NULL, 0, NULL);
CloseHandle(hThread); while(1)
{
// 等待客户请求到来
SOCKET sockConn=accept(sockSrv, (SOCKADDR*)&service,&len); // 接收数据
recv(sockConn, recvBuf, 100, 0);
printf("%s", recvBuf);
// system("pause"); // 如果接收到 R_MNG_REQ 则返回一个 R_MNG_ACK OK
if(!memcmp(recvBuf,TOA_COMMAND_START,strlen(TOA_COMMAND_START)))
{
send(sockConn, TOA_COMMAND_MNG_ACK_OK, strlen(TOA_COMMAND_MNG_ACK_OK)+1, 0);
} // 接收数据
recv(sockConn, recvBuf, strlen(recvBuf), 0);
printf("%s", recvBuf); // 如果接收到 R_LINK_REQ 则返回一个 R_LINK_REPORT\r\n
if(!memcmp(recvBuf,TOA_COMMAND_GET_STATUS,strlen(TOA_COMMAND_GET_STATUS)))
{
send(sockConn, TOA_LINK_REPORT, strlen(TOA_LINK_REPORT)+1,0);
}
// 关闭套接字
// closesocket(sockConn);
}
}DWORD WINAPI testActive(
LPVOID lpparameter
)
{
char recvBuf[100];
memset(recvBuf,0,100); printf("新线程\n"); // 创建用于监听ACTIVE命令的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5001); // 绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); // 将套接字设为监听模式,准备接收客户请求
listen(sockSrv, 5); SOCKADDR_IN service;
int len = sizeof(SOCKADDR); while(1)
{
// 等待客户请求到来
SOCKET sockConn=accept(sockSrv, (SOCKADDR*)&service,&len);
// 接收数据
recv(sockConn, recvBuf, 100, 0);
if(!memcmp(recvBuf,TOA_COMMAND_ACTIVE,strlen(TOA_COMMAND_ACTIVE)))
{
printf("%s", recvBuf);
}
} return 0;
}
,传入连接的套接字..
如果不是多客户端程序同时连接服务器的话,直接把Active中判断是Active的代码放到主线程的死循环中
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
char recvBuf[100] ;
memset(recvBuf,0,100); wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
} if (LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2)
{
WSACleanup( );
return;
}
#pragma comment (lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>#define TOA_COMMAND_START "R_MNG_REQ"
#define TOA_COMMAND_MNG_ACK_OK "R_MNG_ACK OK"
#define TOA_COMMAND_MNG_ACK_NG "R_MNG_ACK NG"
#define TOA_COMMAND_GET_STATUS "R_LINK_REQ"
#define TOA_LINK_REPORT "R_LINK_REPORT\r\n"
#define TOA_COMMAND_ACTIVE "ACTIVE\r\n"DWORD WINAPI testActive(
LPVOID lpparameter
);void main()
{
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
char recvBuf[100] ;
memset(recvBuf,0,100); wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
} if (LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2)
{
WSACleanup( );
return;
} // 创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5001); // 绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// 将套接字设为监听模式,准备接收客户请求
listen(sockSrv, 5); SOCKADDR_IN service;
int len = sizeof(SOCKADDR); // 等待客户请求到来
SOCKET sockConn=accept(sockSrv, (SOCKADDR*)&service,&len); // 心跳指令
HANDLE hThread;
hThread = CreateThread(NULL, 0, testActive,(LPVOID) sockSrv, 0, NULL);
CloseHandle(hThread); while(1)
{
// 接收数据
recv(sockConn, recvBuf, 100, 0);
printf("%s", recvBuf);
// system("pause"); // 如果接收到 R_MNG_REQ 则返回一个 R_MNG_ACK OK
if(!memcmp(recvBuf,TOA_COMMAND_START,strlen(TOA_COMMAND_START)))
{
send(sockConn, TOA_COMMAND_MNG_ACK_OK, strlen(TOA_COMMAND_MNG_ACK_OK)+1, 0);
} // 接收数据
recv(sockConn, recvBuf, strlen(recvBuf), 0);
printf("%s", recvBuf); // 如果接收到 R_LINK_REQ 则返回一个 R_LINK_REPORT\r\n
if(!memcmp(recvBuf,TOA_COMMAND_GET_STATUS,strlen(TOA_COMMAND_GET_STATUS)))
{
send(sockConn, TOA_LINK_REPORT, strlen(TOA_LINK_REPORT)+1,0);
}
recv(sockConn, recvBuf, 100, 0);
if(!memcmp(recvBuf,TOA_COMMAND_ACTIVE,strlen(TOA_COMMAND_ACTIVE)))
{
printf("%s", recvBuf);
} // 关闭套接字
// closesocket(sockConn);
}
}DWORD WINAPI testActive(
LPVOID lpparameter
)
{
char recvBuf[100];
memset(recvBuf,0,100);
SOCKET sockConn=(SOCKET)lpparameter; while(1)
{
recv(sockConn, recvBuf, 100, 0);
if(!memcmp(recvBuf,TOA_COMMAND_ACTIVE,strlen(TOA_COMMAND_ACTIVE)))
{
printf("%s", recvBuf);
}
} return 0;
}