- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我对如何让服务器多次与我的客户端来回发送数据感到困惑。目前服务器将向客户端发送数据,然后客户端将发回答案,但我不知道如何在不一次又一次启动客户端服务器的情况下多次执行此操作。
基本上我想知道如何在不创建新客户端的情况下让服务器和客户端重复通信。
这是我的服务器代码。我正在创建一个随机数,然后使用客户端来确定它的因素
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <cmath>
using namespace std;
int *findPrimes(int primeArray[])
{
int i, j, n = 100000, flag;
//int primeArray[65];
int count = 0;
for(i = 2; i <= n; i++)
{
flag = 1;
for(j =2;j<=i/2;j++)
{
if(i%j==0)
{
flag = 0;
break;
}
}
if(flag==1)
{
primeArray[count] = i;
count++;
}
}
return primeArray;
}
int calcNumber()
{
srand(time(NULL));
int base = rand()%9 + 2;
int numCalc[5];
bool isntBase = false;
int count = 0;
int testNum;
do{
testNum = rand() % 100000;
int number = testNum;
cout << base << ", " << number << endl;
count = 0;
isntBase = false;
for(int i = 0; i < 5; i++)
{
numCalc[i] = 0;
}
while (number > 0)
{
int digit = number%10;
number /= 10;
numCalc[count] = digit;
count++;
if(digit >= base)
{
isntBase = true;
}
}
}while(isntBase == true);
cout << testNum << "(" << base <<")";
int decConvert = 0;
int baseMult = 1;
for(int i = 0; i < 5; i++)
{
//cout << numCalc[i] << endl;
decConvert += numCalc[i]*(pow(base, i));
//baseMult = baseMult * 7;
//cout << decConvert << endl;
}
cout << " = " << decConvert << "(10) = ";
return decConvert;
}
int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[1025];
time_t ticks;
int n = 3;
int numOfPrime= 0;
bool isPrime = false;
bool noMorePlease = false;
int y[9592];
int *prime = findPrimes(y);
int number = calcNumber();
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5575);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 2);
int prcount = 0;
while(noMorePlease == false){
//Thread
int client_socket;
client_socket = accept(listenfd, NULL, NULL);
int primeNum = prime[prcount];
send(client_socket, &number, sizeof(number),0);
send(client_socket, &primeNum,sizeof(primeNum), 0);
int recvNum = 0;
//char recvVal[256];
//recv(listenfd, &number, sizeof(number), 0);
recv(client_socket, &recvNum, sizeof(recvNum), 0);
//cout << endl << recvNum;
if(recvNum >0)
{
cout << prime[prcount] << "^" << recvNum <<"*";
}
while(recvNum > 0)
{
number = number/prime[prcount];
recvNum--;
}
prcount++;
if(number == 1)
{
cout << endl;
numOfPrime = 0;
noMorePlease = true;
}
if(prcount > 9592)
{
numOfPrime++;
cout << " a prime number!" << endl;
numOfPrime++;
if(numOfPrime == n)
{
noMorePlease = true;
cout << "There were " << n << " primes in a row" << endl;
close(listenfd);
return 0;
}
}
//close(client_socket);
}
close(listenfd);
return 0;
}
这是我的客户端代码
#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, char *argv[])
{
int sockfd = 0, n = 0;
char recvBuff[1024];
struct sockaddr_in serv_addr;
if(argc != 2)
{
printf("\n Usage: %s <ip of server> \n",argv[0]);
return 1;
}
memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5575);
if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
int number = 0;
int primeNum;
char recvVal[256];
recv(sockfd, &number, sizeof(number), 0);
recv(sockfd, &primeNum, sizeof(primeNum), 0);
int divCount = 0;
cout << number << ", " << primeNum << endl;
while(number % primeNum == 0)
{
cout << number << ", ";
number = number/primeNum;
divCount++;
}
cout << endl << divCount;
send(sockfd, &divCount,sizeof(divCount), 0);
/*
while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
recvBuff[n] = 0;
if(fputs(recvBuff, stdout) == EOF)
{
printf("\n Error : Fputs error\n");
}
}
if(n < 0)
{
printf("\n Read error \n");
}
*/
close(sockfd);
return 0;
}
最佳答案
在您的客户端代码中,在行之后:
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
您应该在一个循环中执行recv 和send,以便连接保持打开状态。完成后,退出循环并关闭套接字。此方法的示例使用同步套接字,可在此处找到:https://vcansimplify.wordpress.com/2013/03/14/c-socket-tutorial-echo-server/
关于c++ linux套接字服务器反复调用客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49077503/
我有一个小心理障碍:我有一个 html 中的 javascript 函数,可以在按下某个键时写入键码。我已经将它连接到一个函数,该函数可以准确地告诉我按下了什么字符和键码(不包括在内)。 我的问题是如
我上网已经有一段时间了,现在正试图解决这个问题。可以找到正在发生的事情的视频: https://i.gyazo.com/59fc489b6099b513c41aedeed482b8d2.mp4 $(d
我有一个 Python 程序,其中一个函数导入另一个脚本并运行它。但是脚本仅在第一次函数被调用时运行。 def Open_Generator(事件): 导入密码生成器 有什么建议吗? *该函数在 tk
我正在尝试在 git 中创建两个包含二进制文件的分支 - 一个“开发”分支和一个“稳定”分支。在我想将它们“发布”到稳定分支之前,开发分支可以对这些文件进行一些更改(并且稳定分支已重命名这些文件,以防
我在 IBM BlueMix 中的 Node Red 应用程序反复崩溃 - 每小时一次 - 除了“exited with status: 1.”之外没有任何真正的错误消息 如何解决此问题? 是否有来自
我是一名优秀的程序员,十分优秀!