Witam.
Napisałem sobie serwer TCP w WinSock (z racji, iż to moje pierwsze sieciowe przedsięwzięcie to korzystałem z poradnika, https://www.youtube.com/watch?v=WDn-htpBlnU). Póki co miał zwracać to co napisał użytkownik, jak na filmie, jednakże ten zwraca wszystko od razu, jak na screenie https://i.imgur.com/fKW4Bar.png. (Hasła oczywiście zaszyfrowane ;d, jeśli ktoś to zauważył)
Nie wiem co może być przyczyną.
Myślałem, żeby zrobić jedną zmienną char która będzie dołączana do całego stringa aż do napotkania znaku '\n' ale nie wiem czy tak po prostu musiałbym zrobić, czy jest to jakiś błąd. Facet z filmiku nie musiał tak robić.
Dodatkowo mam parę pytań, a żeby nie zaśmiecać serwisu zadam je w tym wątku. Na screenie widać, że po stronie klienta (po stronie serwera również, ale to już logi) jest wypisywane " connected (liczba)". Pusta przestrzeń jest tam dlatego, że przed connected ma być nazwa hosta, która nie jest wyświetlana. liczba to port, jednakże nie wiem dlaczego jest inny niż port przez który się łączę i to jest pytanie pierwsze - dlaczego ten port jest inny. Drugim pytaniem jest czy jest wiadome dlaczego ta nazwa nie jest wyświetlana? Trzecim - na screenie widać, że ten napis Wwiittaamm czy ssiieemmaa są z dziwnym odstępem - kiedy po połączeniu wysyłam do klienta ten napis connected to taka wyrwa jest, jeśli nie wysyłam jest git. Teraz zrobiłem, że wysyła kolejny tekst z napisem składającym się z \b (jest ich tyle ile ma znaków wiadomość connected) ale wątpię czy jest to dobry sposób.
Jeśli ktoś byłby w stanie mi pomóc to bardzo dziękuję. Za wszelkie niedociągnięcia z góry przepraszam, w razie czego proszę się pytać.
Pozdrawiam.
PS tutaj cały kod:
//pętla while od 71 linii
#include <iostream>
#include <WS2tcpip.h>
#include <winsock2.h>
#include <thread>
#include <chrono>
#include <sstream>
#include <ctime>
#pragma comment(lib, "ws2_32.lib")
std::string LogInfo();
int main(){
WSADATA wData;
std::cout<< LogInfo() <<"Initializing server...\n";
if(WSAStartup(MAKEWORD(2,2), &wData)!=0){
std::cout<< LogInfo() <<"Cannot initialize server. (WSADATA)\n";
return 1;
}
SOCKET ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ListeningSocket == INVALID_SOCKET){
std::cout<<"Cannot initialize server. (SOCKET)\n";
return 2;
}
sockaddr_in address;
address.sin_addr.S_un.S_addr = INADDR_ANY;
address.sin_family = AF_INET;
address.sin_port = htons(55555);
bind(ListeningSocket, reinterpret_cast<sockaddr*>(&address), sizeof(address));
std::cout<< LogInfo() <<"Server is ready. Waiting for connection.\n";
listen(ListeningSocket, SOMAXCONN);
sockaddr_in client;
int ClientSize = sizeof(client);
SOCKET ClientSocket = accept(ListeningSocket, reinterpret_cast<sockaddr*>(&client), &ClientSize);
if(ClientSocket == INVALID_SOCKET){
std::cout<<"Cannot connect with user\n";
return 3;
}
char host[NI_MAXHOST];
char port[NI_MAXSERV];
memset(host, 0, NI_MAXHOST);
memset(port, 0, NI_MAXSERV);
std::string message;
if(getnameinfo(reinterpret_cast<sockaddr*>(&ClientSocket), sizeof(ClientSocket), host, NI_MAXHOST, port, NI_MAXSERV, 0) == 0){
std::stringstream PortInStr;
PortInStr << port;
message = std::string(host) + " conected. ("+PortInStr.str()+")\n";
}else{
inet_ntoa(client.sin_addr);
std::stringstream PortInStr;
PortInStr << htons(client.sin_port);
message = std::string(host) + " connected. ("+std::string(PortInStr.str())+")\n";
}
std::string back;
for(int i=0;i<message.length();++i) back.append("\b");
std::cout<< LogInfo() <<message;
send(ClientSocket, message.c_str(), message.length(), 0);
send(ClientSocket, back.c_str(), back.length(), 0);
closesocket(ListeningSocket);
char UserInput[2048];
while(true){
memset(UserInput, 0, 2048);
int ReceivedBytes = recv(ClientSocket, UserInput, 2048, 0);
if(UserInput[0]>32)
std::cout<< LogInfo() <<UserInput<<"\n";
if(ReceivedBytes == SOCKET_ERROR){
std::cout<<"Cannot receive input.\n";
break;
}if(ReceivedBytes == 0){
std::cout<<"Client disconnected.\n";
std::this_thread::sleep_for(std::chrono::seconds(3));
break;
}
send(ClientSocket, UserInput, ReceivedBytes+1, 0);
}
closesocket(ClientSocket);
WSACleanup();
}
std::string LogInfo(){
time_t rawtime = time(0);
std::tm* now = localtime(&rawtime);
std::stringstream time;
std::string month, day, hour, minute, second;
if(std::to_string(now->tm_mon).length()==1) month = '0';
if(std::to_string(now->tm_mday).length()==1) day = '0';
if(std::to_string(now->tm_hour).length()==1) hour = '0';
if(std::to_string(now->tm_min).length()==1) minute = '0';
if(std::to_string(now->tm_sec).length()==1) second = '0';
month += std::to_string(now->tm_mon);
day += std::to_string(now->tm_mday);
hour += std::to_string(now->tm_hour);
minute += std::to_string(now->tm_min);
second += std::to_string(now->tm_sec);
time<<now->tm_year+1900<<"-"<<month<<"-"<<day<<" "<<hour<<":"<<minute<<":"<<second<<"> ";
return time.str();
}