c++ socket - Bad File Descriptor?
Hej
Jag försöker bygga en socketserver som skall lyssna på en klient och ge svar tillbaka.
Jag kan ansluta till servern men när klienten börjar skicka data så spottar den ut: ERROR on accept: Bad File Descriptor.
Här är koden:
#include <iostream>
#include <string>
#include <cstring>
#include <sstream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
void error(char *msg)
{
perror(msg);
exit(1);
}
int main (int argc, char * const argv[]) {
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int P_value = 6435;
string u_value;
string p_value;
int i;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
switch (argv[i][1]) {
case 'P': P_value = atoi(argv[++i]);
break;
case 'u': u_value = argv[++i];
break;
case 'p': p_value = argv[++i];
break;
}
}
}
if (P_value < 2 || u_value.empty() || p_value.empty())
error("ERROR: To few arguments supplied, look at --help");
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = P_value;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
while (1){
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
int pid;
pid=fork();
if (pid < 0)
error("ERROR on fork");
if (pid == 0){
close(sockfd);
bzero(buffer,256);
write(newsockfd,"This is version 0.1 of the API >> ",34);
read(newsockfd,buffer,255);
printf("Client said: %s",buffer);
stringstream ss;
string buff;
ss << buffer;
ss >> buff;
size_t userfound;
userfound=buff.find(u_value);
if(userfound!=string::npos){
cout << "Give me your password >>";
}
}
else{
close(newsockfd);
}
}
}
Någon som kan hjälpa mig att förstå problemet?
MVH niclas