linux编程为什么会报accept() error: Bad file descriptor
服务器端运行端口号不是我设定的5000,出现乱码,提示accept() error: Bad file descriptor
//server.cpp
#include<stdio.h>
#include<strings.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <stdlib.h>
#define PORT 5000
#define MAXDATASIZE 1000
void process_cli(int connecetfd, sockaddr_in client);
int main()
{
int listenfd, connectfd;
sockaddr_in server;
sockaddr_in client;
pid_t pid;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket() errpr");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
memset(&server,0,sizof(server));
//bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (sockaddr* )&server, sizeof(server)) == -1)
{
perror("bind() error");
exit(1);
}
if (listen(listenfd, 5) == -1)
{
perror("listen error");
exit(1);
}
socklen_t len = sizeof(client);
while(1)
{
if(connectfd = accept(listenfd, (sockaddr*) &client, &len ) == -1)
{
perror("accept() error");
return -1;
}
pid = fork();
if(pid > 0)
{
close(connectfd);
continue;
}
else if(pid == 0)
{
close(listenfd);
process_cli(connectfd, client);
}
else
{
printf("fork() error");
exit(0);
}
}
close(listenfd);
return 0;
}
void process_cli(int connectfd, sockaddr_in client)
{
int num;
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];
printf("you got a connection from client's IP is %s, port is %d \n", inet_ntoa(client.sin_addr), htons(client.sin_port));
while(num = recv(connectfd, cli_name, MAXDATASIZE, 0) > 0);
{
cli_name[num-1] = '\0';
printf("client name is %s. \n", cli_name);
}
while(num = recv(connectfd, recvbuf, MAXDATASIZE, 0) > 0)
{
recvbuf[num] = '\0';
printf("receiveed client (%s) message : %s\n",cli_name, recvbuf);
for(int i = 0; i < num; i++)
{
sendbuf[i] = recvbuf[num - i - 1];
}
sendbuf[num] = '\0';
printf("afetr reverse : %s\n",sendbuf);
}
}
//client.cpp
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include <stdlib.h>
#define PORT 5000
#define MAXDATASIZE 1000
int process(FILE *fp, int sockfd);
char * getmessage(char* sendbuf, FILE* fp);
int main(int argc, char* argv[])
{
int sockfd;
char buf[MAXDATASIZE];
hostent *he;
sockaddr_in server;
if(argc != 2)
{
printf("usage: %s <IP Address>", argv[0]);
exit(1);
}
if((he = gethostbyname(argv[1])) == NULL)
{
printf("gethostbyname() error");
exit(1);
}
if((sockfd= socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket() errpr");
exit(1);
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr= *((in_addr *)he->h_addr);
if(connect(sockfd, (sockaddr*) &server, sizeof(server)) == -1)
{
printf("connect() error");
exit(1);
}
process(stdin, sockfd);
close(sockfd);
return 0;
}
int process(FILE* fp, int sockfd)
{
char sendbuf[MAXDATASIZE], recvbuf[MAXDATASIZE];
int num;
printf("connect to server. \n");
printf("input client's name :");
if(fgets(sendbuf, MAXDATASIZE, fp) == NULL)
{
printf("\nexit. \n");
exit(1);
}
send(sockfd, sendbuf, strlen(sendbuf), 0);
while(getmessage(sendbuf, fp))
{
send(sockfd, sendbuf, strlen(sendbuf), 0);
if(num = recv(sockfd, recvbuf, MAXDATASIZE, 0) == 0)
{
printf("server terminated. \n");
exit(1);
}
recvbuf[num] = '\0';
printf("server message: \%s\n", recvbuf);
}
return 0;
}
char* getmessage(char* sendbuf, FILE* fp)
{
printf("input string to server: ");
return(fgets(sendbuf, MAXDATASIZE, fp));
}