问题描述
我正在尝试学习如何构建服务器。尝试将数据从我的客户端应用程序发送到服务器应用程序时,服务器应用程序未收到任何数据。我认为这仅仅是因为我对所发送的char缓冲区缺乏了解。客户端可以加入服务器,并且服务器确实注册了客户端。
服务器:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include<windows.h>
#include<winsock2.h>
#include<ws2tcpip.h>
#include<iphlpapi.h>
#include<iostream>
#include<fstream>
#include<string>
#pragma comment(lib,"ws2_32.lib")
#define PORT "69"
#define BUFFLEN 512
int main(int argc,char* argv[]) {
bool active = true;
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
struct addrinfo* result = NULL,* ptr = NULL,hints;
ZeroMemory(&hints,sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
std::cout << "which port should be initialized?\n>>>";
std::string input;
std::cin >> input;
std::cout << "initializing..." << std::endl;
getaddrinfo(NULL,input.c_str(),&hints,&result);
SOCKET listenSocket = INVALID_SOCKET;
listenSocket = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
bind(listenSocket,result->ai_addr,(int)result->ai_addrlen);
freeaddrinfo(result);
listen(listenSocket,SOMAXCONN);
std::cout << "initialized" << std::endl;
//accept connection
std::cout << "waiting for client..." << std::endl;
SOCKET clientSocket = INVALID_SOCKET;
clientSocket = accept(listenSocket,NULL,NULL);
std::cout << "client connected" << std::endl;
char recvBuf[100];
int dataRes;
std::cout << "TERMINAL:" << std::endl;
while (active) {
dataRes = recv(clientSocket,recvBuf,100,0);
if (dataRes > 0) {
if (recvBuf == "terminate")
active = false;
else
std::cout << "CLIENT:" << recvBuf << std::endl;
}
}
shutdown(clientSocket,SD_SEND);
closesocket(clientSocket);
WSACleanup();
}
客户:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <iostream>
// Need to link with Ws2_32.lib,Mswsock.lib,and Advapi32.lib
#pragma comment (lib,"Ws2_32.lib")
#pragma comment (lib,"Mswsock.lib")
#pragma comment (lib,"AdvApi32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "69"
int __cdecl main(int argc,char** argv)
{
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
struct addrinfo* result = NULL,hints;
const char* sendbuf = "this is a test";
char recvbuf[DEFAULT_BUFLEN];
int iResult;
int recvbuflen = DEFAULT_BUFLEN;
std::cout << "enter ip address\n>>>";
std::string input;
std::cin >> input;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,&wsaData);
ZeroMemory(&hints,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// Resolve the server address and port
iResult = getaddrinfo(input.c_str(),DEFAULT_PORT,&result);
// Attempt to connect to an address until one succeeds
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {
// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol);
// Connect to server.
iResult = connect(ConnectSocket,ptr->ai_addr,(int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
continue;
}
break;
}
freeaddrinfo(result);
if (ConnectSocket == INVALID_SOCKET) {
printf("Unable to connect to server!\n");
WSACleanup();
return 1;
}
//iResult = send(ConnectSocket,sendbuf,(int)strlen(sendbuf),0);
iResult = shutdown(ConnectSocket,SD_SEND);
// Receive until the peer closes the connection
bool serverActive = true;
while (serverActive) {
char inp[100];
std::cin >> inp;
std::cout << "SENT:" << inp << std::endl;
send(ConnectSocket,inp,(int)strlen(inp),0);
if (inp == "terminate")
serverActive = false;
}
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)