У меня есть функция, которая действует как сервер, другая функция, которая действует как клиент. Я могу общаться друг с другом, но данные, которые я хочу распечатать в качестве вывода (сервер), не распечатываются, пока я не закроюsocket.Но выводится для клиента.
КОД КЛИЕНТА
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");
}
КОД СЕРВЕРА
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();
}
}
После установления соединения любые данные отправляются с серверапринимаются и распечатываются, но на сервер отправляются данные, но любые последующие операторы cout не печатаются
Редактировать: Сокеты являются глобальными переменными, поэтому мы можем использовать их повторно.