I have a function which acts as a server an another function which acts as a client.I am able to communicate with each other but the data which i want to print as the output(server)is not printed till i close the socket.But the output is shown for he client.
CLIENT CODE
void SubscriberConnection::ReceiveFileFromPublisher()
{
char buff[1024];
string check="verified";
int n;
//sending key
bzero(buff,sizeof(buff));
read(SubToPubSockfd,buff,sizeof(buff));
cout<<buff<<"\n";
bzero(buff, sizeof(buff));
n=0;
while ((buff[n++] = getchar()) != '\n');
write(SubToPubSockfd, buff, sizeof(buff));
//receiving verification
bzero(buff, sizeof(buff));
read(SubToPubSockfd, buff, sizeof(buff));
string reply(buff);
if (reply.compare(check) == 0)
{
cout << "Enter name of file required\n";
bzero(buff, sizeof(buff));
n = 0;
while ((buff[n++] = getchar()) != '\n');
write(SubToPubSockfd, buff, sizeof(buff));
cout<<"File request sent \n";
int ch = 0;
char buffer[256] = {0};
FILE *fp;
fp = fopen(buff, "a");
int words;
read(SubToPubSockfd, &words, sizeof(int));
while (ch != words)
{
read(SubToPubSockfd, buffer, 255);
fprintf(fp, "%s", buffer);
ch++;
}
printf("The file was received successfully\n\n");
}
SERVER CODE
void PublisherConnection::listenForSubscriber()
{
ALSSockFd = socket(AF_INET, SOCK_STREAM, 0);
if (ALSSockFd < 0)
error("ERROR opening socket");
else
printf("Socket successfully created..\n");
bzero((char *)&ALSServAddr, sizeof(ALSServAddr));
ALSServAddr.sin_family = AF_INET;
ALSServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
ALSServAddr.sin_port = htons(PORT_PUB_SUB);
if (bind(ALSSockFd, (struct sockaddr *)&ALSServAddr, sizeof(ALSServAddr)) < 0)
{
error("ERROR on binding");
}
else
printf("Socket successfully binded..\n");
if ((listen(ALSSockFd, 5)) != 0)
{
printf("Listen failed...\n");
exit(0);
}
else
printf("Publisher listening..\n");
SubLen = sizeof(Sub_Addr);
ALSNewSockFd = accept(ALSSockFd, (struct sockaddr *)&Sub_Addr, &SubLen);
if (ALSNewSockFd < 0)
{
error("ERROR on accept");
}
else
cout << "Connected to Subscriber";
askForFile();
}
void PublisherConnection::askForFile()
{
string key = "123456\n";
char buff[1024];
int n, i;
//asks to enter key
string message="Please enter the key";
write(ALSNewSockFd,message.c_str(),sizeof(message));
cout<<"Asked For key";
//receives key;
bzero(buff, sizeof(buff));
read(ALSNewSockFd, buff, sizeof(buff));
string inputKey(buff);
if (key.compare(inputKey) == 0)
{
string message = "verified";
write(ALSNewSockFd, message.c_str(), sizeof(buff));
//receving file name
bzero(buff, sizeof(buff));
read(ALSNewSockFd, buff, sizeof(buff));
cout << "\nPublisher asked for:" << buff;
sendFileToSub(buff);
//printf("From Subscriber : %s", buff);
//}
}
else{
string message = "Wrong key";
write(ALSNewSockFd, message.c_str(), sizeof(buff));
askForFile();
}
}
After the connection takes place, any data sent from server is being received and printed but on the server the data is being sent but any following cout statements are not being printed
Edit: The sockets are global variables so we can reuse them.