Receive multiple data- client- server
Hello,
what should I need to change in (I assume) server code to receive
more than one sentence that I seand from Client application.
Here's code:
Client:
Code:
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <cstring>
#define PORT 5193
#define Version 0x0002
#define BUFFER_SIZE 1024
char hostname[]="localhost";
char *menu[]={"1. Send data\n","2. End session\n","Your choice: "};
int main()
{
char msg[BUFFER_SIZE];
WSADATA wsaData;
SOCKET sServer;
SOCKADDR_IN ServerSockAddr;
hostent* pHost;
protoent* pProtocol;
WSAStartup(Version,&wsaData);
ZeroMemory((void*)&ServerSockAddr,sizeof(ServerSockAddr));
pHost=gethostbyname(hostname);
if(pHost==NULL)
{
std::cout<<"Error! Cannot get host infos!"<<std::endl;
return 1;
}
ServerSockAddr.sin_family=AF_INET;
ServerSockAddr.sin_port=htons(PORT);
memcpy(&ServerSockAddr.sin_addr,pHost->h_addr,pHost->h_length);
pProtocol=getprotobyname("tcp");
if(pProtocol==NULL)
{
std::cout<<"Error! Cannot get protocol infos!"<<std::endl;
return 1;
}
sServer=socket(AF_INET,SOCK_STREAM,pProtocol->p_proto);
if(sServer==INVALID_SOCKET)
{
std::cout<<"Error! Cannot create socket!"<<std::endl;
return 1;
}
if(connect(sServer,(const sockaddr*)&ServerSockAddr,sizeof(sockaddr))==SOCKET_ERROR)
{
std::cout<<"Error! Cannot connect!"<<std::endl;
return 1;
}
int end=7;
do
{
std::cout<<menu[0];
std::cout<<menu[1];
std::cout<<menu[2];
std::cin>>end;
switch(end)
{
case 1:
{
std::cin.clear();
std::cin.ignore(BUFFER_SIZE, '\n');
std::cout<<"Enter sentence to send: ";
std::cin.getline(msg,BUFFER_SIZE,'\n');
send(sServer,msg,(int)strlen(msg)+1,0);
}
break;
case 2:
break;
default:
std::cout<<"Wrong choice"<<std::endl;
}
}while(end !=2);
closesocket(sServer);
WSACleanup();
return 0;
}
Server:
Code:
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#define PORT 5193
#define MAX_CON 5
#define BUFFER_SIZE 1024
#define Version 0x0002
int main()
{
SOCKADDR_IN ServerSockAddr,ClientSockAddr;
struct protoent* pProtocolInfo;
SOCKET sServer,sClient;
int aLen;
char msg [BUFFER_SIZE];
WSADATA wsaData;
WSAStartup(Version,&wsaData);
ZeroMemory((void*)&ClientSockAddr,sizeof(ClientSockAddr));
ZeroMemory((void*)&ServerSockAddr,sizeof(ServerSockAddr));
ServerSockAddr.sin_family=AF_INET;//stays in host byte order
ServerSockAddr.sin_port=htons(PORT);//network byte order
ServerSockAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//network byte order
if((pProtocolInfo=getprotobyname("tcp"))==0)
{
std::cout<<"Error! Cannot get protocol info!"<<std::endl;
return 1;
}
//Creating socket
sServer=socket(AF_INET,SOCK_STREAM,pProtocolInfo->p_proto);
if(sServer==INVALID_SOCKET)
{
std::cout<<"Error! Cannot create server socket!"<<std::endl;
return 1;
}
//Binding socket
if(bind(sServer,(const sockaddr *)&ServerSockAddr,sizeof(sockaddr))==SOCKET_ERROR)
{
std::cout<<"Error! Cannot bind server socket!"<<std::endl;
return 1;
}
//Listening for incomming connections
if(listen(sServer,MAX_CON)==SOCKET_ERROR)
{
std::cout<<"Error! Cannot listen for incomming! connections"<<std::endl;
return 1;
}
std::cout<<"Listening for incomming connections!"<<std::endl;
aLen=sizeof(ClientSockAddr);
while(true)
{
int get;
sClient=accept(sServer,(sockaddr*)&ClientSockAddr,&aLen);
if(sClient==SOCKET_ERROR)
{
std::cout<<"Error! Cannot accept connection"<<std::endl;
return 1;
}
get=recv(sClient,msg,BUFFER_SIZE,0);
if(get==SOCKET_ERROR)
{
std::cout<<"Receiving error!"<<std::endl;
return 1;
}
if(get==0)
{
std::cout<<"Transmission ended!"<<std::endl;
break;
}
else
{
std::cout<<msg<<std::endl;
continue;
}
}
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return 0;
}
When I send first sentence, it is shown in server application, but every other sentence are ignored
Why?
Thanks for help!