我想创建一个可以作为服务运行的应用程序,以及另一个可以与之通信的程序(在c ++中)。基本上我希望程序向服务发送消息,服务只是将它们回送给程序
程序的示例输出将是这样的: 请输入你的留言:你好 从服务器接收响应:hello
我在UDP中有一个非常简单的客户端服务器程序来执行此操作 - 服务器回送客户端发送的消息。 所以我的问题是我可以将服务器更改为服务并更改客户端,以便它仍与服务通信吗?如果是这样,这是怎么做的?
我之前从未使用过代码来创建服务,如果有人可以链接任何很棒的教程
继承我要改变的程序: 服务器
void InitWinsock()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
}
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET socketS;
InitWinsock();
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen = sizeof(from);
local.sin_family = AF_INET;
local.sin_port = htons(1234);
local.sin_addr.s_addr = INADDR_ANY;
socketS = socket(AF_INET,SOCK_DGRAM,0);
bind(socketS,(sockaddr*)&local,sizeof(local));
while (1)
{
char buffer[1024];
ZeroMemory(buffer, sizeof(buffer));
printf("Waiting...\n");
if (recvfrom(socketS,buffer,sizeof(buffer),0,(sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
{
printf("Received message from %s: %s\n",inet_ntoa(from.sin_addr), buffer);
sendto(socketS, buffer, sizeof(buffer), 0, (sockaddr*)&from, fromlen);
}
Sleep(500);
}
closesocket(socketS);
return 0;
}
客户端:
void InitWinsock()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
}
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET socketC;
InitWinsock();
struct sockaddr_in serverInfo;
int len = sizeof(serverInfo);
serverInfo.sin_family = AF_INET;
serverInfo.sin_port = htons(1234);
serverInfo.sin_addr.s_addr = inet_addr("127.0.0.1");
socketC = socket(AF_INET,SOCK_DGRAM,0);
while (1)
{
char buffer[1024];
ZeroMemory(buffer, sizeof(buffer));
printf("Please input your message: ");
scanf("%s", buffer);
if (strcmp(buffer,"exit") == 0)
break;
if (sendto(socketC, buffer, sizeof(buffer), 0, (sockaddr*)&serverInfo, len) != SOCKET_ERROR)
{
if (recvfrom(socketC, buffer, sizeof(buffer), 0, (sockaddr*)&serverInfo, &len) != SOCKET_ERROR)
{
printf("Receive response from server: %s\n", buffer);
}
}
}
closesocket(socketC);
return 0;
}
答案 0 :(得分:0)
忘记更改代码,只需使用srvany即可。
答案 1 :(得分:0)
使用service example作为sergmat说。使用Svp.cpp中的代码,并将其放入您的服务器。将SVCNAME
更新为您的服务名称。获取_tmain
中的代码,并将其放在SvcInit
所在的TO_DO: Perform work until service stops
的底部。取出它下面的while
循环。
另外,您的服务器在主循环中有一个Sleep(500)
。这是不必要的,因为服务器无论如何都会阻塞recv
。
要终止服务,而不是使用ghSvcStopEvent
,我只是使套接字句柄和一些closing
标志全局,然后设置标志并在获得{{时关闭套接字1}}信号。
你会有更多的清理细节,但这不仅仅是让你开始......