2016-12-27 3 views
1

У меня проблема с бесконечным циклом, в то время как я пытаюсь отправить некоторые сообщения от клиента на сервер. Клиент имеет некоторые команды, такие как login, getusers, alias и т. Д., И я хочу проверить их на сервере. Вот его мой код.Ошибка программирования сокета в C

КЛИЕНТ

#include<stdio.h> 
#include<sys/socket.h> 
#include<arpa/inet.h> // for inet_addr 
#include <string.h> 
#include <zconf.h> 

int main(int argc, char *argv[]) { 
    int sock; 
    struct sockaddr_in server; 
    char message[2000], server_reply[2000]; 

    //Create socket 
    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock == -1) { 
     printf("Could not create socket"); 
    } 

    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_family  = AF_INET; 
    server.sin_port  = htons(8888); 

    //Connect to remote server 
    if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { 
     perror("Connect failed. Error"); 
     return 1; 
    } 

    puts("Connected to server\n"); 


    //keep communicating with server 
    while (1) { 

     printf("> "); 
     scanf("%[^\n]s", message); 
     fflush(stdin); 

     //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; 
     } 

     printf("Server's reply : %s ", server_reply); 
    } 

    close(sock); 
    return 0; 
} 

SERVER

#include<stdio.h> 
#include<string.h> // for strlen 
#include<stdlib.h> 
#include<sys/socket.h> 
#include<arpa/inet.h> // for inet_addr 
#include<unistd.h> // for write 
#include<pthread.h> // for threading, link with lpthread 
#include "server.h" 
#include "split.h" 

#define MAX_CLIENT_NUMBER 100 

void *connection_handler(void *); 

struct User { 
    char userName[10]; 
    int clientSocketNo; 
}; 

struct User users[MAX_CLIENT_NUMBER]; 

void getUsers() { 
    printf("Number %d",userArrayIndex); 

    for (int i = 0; i < userArrayIndex; ++i) { 
     printf("%s\n", users[i].userName); 
    } 
} 

void addUserToArray(char userName[10], int socketNumber) { 
    printf("Client logged in as %s\n", userName); 
    strcpy(users[userArrayIndex].userName, userName); 
    users[userArrayIndex].clientSocketNo = socketNumber; 
    userArrayIndex++; 
} 

void loginUser(char userName[10], int socketNumber) { 
    char *message = "login successful"; 
    write(socketNumber, message, strlen(message)); 
    addUserToArray(userName, socketNumber); 
} 

void *connection_handler(void *socket_desc) { 
    //Get the socket descriptor 
    char receivedMessage[2000]; //client's message 

    int readControl; 
    int sock   = *((int *) socket_desc); 

    while ((readControl = recv(sock, receivedMessage, 2000, 0)) > 0) { 
     char **parsedCommand = malloc(100); //parsedClientMessage 

     parsing(parsedCommand, receivedMessage, " "); 
     printf("MESSAGE %s\n",parsedCommand[0]); 

     if (strcmp(parsedCommand[0], "login") == 0) { 
      loginUser(parsedCommand[1], sock); 
     } 

     if (strcmp(parsedCommand[0], "getusers") == 0) { 

      getUsers(); 
     } 

     if (strcmp(parsedCommand[0], "exit") == 0) { 
      close(sock); 
      return 0; 
     } 

    } 

    if (readControl == 0) { 
     puts("Client disconnected"); 
     clientNumber--; 
     fflush(stdout); 
    } else if (readControl == -1) { 
     perror("recv failed"); 
    } 

    //Free the socket pointer 
    free(socket_desc); 
    return 0; 
} 

int main(int argc, char *argv[]) { 

    int socket_desc, new_socket, c, *new_sock; 
    struct sockaddr_in server, client; 

    //Create Socket 
    socket_desc = socket(AF_INET, SOCK_STREAM, 0); 
    if (socket_desc == -1) { 
     puts("Could not create socket"); 
     return 1; 
    } 

    server.sin_family  = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port  = htons(8888); 

    if (bind(socket_desc, (struct sockaddr *) &server, sizeof(server)) < 0) { 
     puts("Binding failed"); 
     return 1; 
    } 

    listen(socket_desc, 3); 

    puts("Server started"); 
    c     = sizeof(struct sockaddr_in); 
    while ((new_socket = accept(socket_desc, (struct sockaddr *) &client, (socklen_t *) &c)) && 
      clientNumber < MAX_CLIENT_NUMBER) { 
     pthread_t sniffer_thread/*[MAX_CLIENT_NUMBER]*/; 
     new_sock = malloc(1); 
     *new_sock = new_socket; 

     if (pthread_create(&sniffer_thread/*[clientNumber]*/, NULL, connection_handler, 
          (void *) new_sock) < 0) { 
      perror("Could not create thread"); 
      return 1; 
     } else { 
      clientNumber++; 
     } 

     puts("Client connected"); 
    } 


    if (new_socket < 0) { 
     perror("accept failed"); 
     return 1; 
    } 

    return 0; 
} 

Его не полный моего кода, но я думаю, что наша проблема в этих краях. Я не понимаю, почему это происходит. Когда я вставляю команду break в цикл while_handler, я больше не могу отправлять команды на сервер. Спасибо ...

+1

Вы должны описать свою проблему, а не просто сказать, что у вас ее есть. –

+0

На стороне клиента запуск должен быть остановлен в scanf для получения новых команд, но он не останавливается – Berkin

+1

Как всегда бывает в коде «running», попробуйте отладчик – KevinDTimm

ответ

0

Поскольку '\n' не удаляется с входа, функция scanf() может повторно использовать последний символ для следующей записи.

Самое простое решение, чтобы решить эту проблему, чтобы очистить входной буфер fflush(stdin);.

while (1) { 
    printf("> "); 
    scanf("%[^\n]s", message); 
    fflush(stdin); // to clear \n from the buffer 
    //Send some data 
    if (send(sock, message, strlen(message), 0) < 0) { 
+0

Im пытается это прямо сейчас, спасибо – Berkin

+0

Я добавил полный мой код, вы можете проверить его еще раз. благодаря – Berkin

1

я решил. когда я malloc сообщения или ответы, я даю +1 для strlen (messsage).

Значит, его проблема (сообщение) +1 решила мою проблему

Смежные вопросы