我有一个小问题:我的服务器明白他不能接受新的连接,但客户端仍认为他已连接。 我不知道如何解决这个问题。拒绝连接到服务器C套接字编程
我的客户端代码:
#include<stdio.h> //printf
#include<string.h> //strlen
#include<sys/socket.h> //socket
#include<arpa/inet.h> //inet_addr
#include <fcntl.h> // for open
#include <unistd.h> // for close
int main(int argc , char *argv[]){
int sock;
struct sockaddr_in server;
char message[1000] , server_reply[2000];
//Create socket
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1){
printf("Could not create socket");
}
puts("Socket created");
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(8080);
//Connect to remote server
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0){
perror("connect failed. Error");
return 1;
}
puts("Connected\n");
//keep communicating with server
while(1){
printf("Enter message : ");
scanf("%s" , message);
//Send some data
if(send(sock , message , strlen(message) , 0) < 0){
puts("Send failed");
return 1;
}
//Receive a reply from the server
if(recv(sock , server_reply , 2000 , 0) < 0){
puts("recv failed");
break;
}
puts("Server reply :");
puts(server_reply);
}
close(sock);
return 0;
}
而我的服务器代码:
#include<stdio.h>
#include<string.h> //strlen
#include<stdlib.h> //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h> //write
#include<pthread.h> //for threading , link with lpthread
#define MAX_PLAYER 4
void *connection_handler(void *);
int nbrePlayer = 0;
int main(int argc , char *argv[]){
int socket_desc , client_sock , c , *new_sock;
struct sockaddr_in server , client;
//Create socket
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}
puts("Socket created");
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8080);
//Bind
if(bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0){
//print the error message
perror("bind failed. Error");
return 1;
}
puts("bind done");
//Listen
if(listen(socket_desc , 4)<0){
perror("listen");
return 1;
}
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
while((client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c))>0){
if(nbrePlayer>=MAX_PLAYER){
puts("connection refused");
close(client_sock);
continue;
} else {
puts("Connection accepted");
}
nbrePlayer++;
pthread_t sniffer_thread;
new_sock = malloc(1);
*new_sock = client_sock;
if(pthread_create(&sniffer_thread , NULL , connection_handler , (void*) new_sock) < 0){
perror("could not create thread");
return 1;
}
//Now join the thread , so that we dont terminate before the thread
//pthread_join(sniffer_thread , NULL);
puts("Handler assigned");
printf("%d\n",nbrePlayer);
}
if (client_sock < 0){
perror("accept failed");
return 1;
}
return 0;
}
/*
* This will handle connection for each client
* */
void *connection_handler(void *socket_desc){
//Get the socket descriptor
int sock = *(int*)socket_desc;
int read_size;
char *message , client_message[2000];
//Receive a message from client
while((read_size = recv(sock , client_message , 2000 , 0)) > 0){
//Send the message back to client
write(sock , client_message , strlen(client_message));
}
if(read_size == 0){
puts("Client disconnected");
fflush(stdout);
}
else if(read_size == -1){
perror("recv failed");
}
//Free the socket pointer
free(socket_desc);
`nbrePlayer`--;
//Delete the player for the shared memory
return 0;
}
THX着您的答案
你的服务器理解这一点,客户的意思以为它连接?它是如何显示的?究竟发生了什么? –
OT:这个......接受(...,(socklen_t *)&c)'是坏的。想象一下'int'和'socklen_t'将会有不同的大小!直接将'c'定义为'socklen_t'。 – alk
OT:当服务器开始发送“更大”的数据量时,这个'if(recv(sock,server_reply,2000,0)<0)'会开始给你头痛。请仔细阅读“recv()”文档,以了解对N字节的send()调用可能会导致N次调用recv()来接收发送的N个字节。 – alk