소켓 연결이 거부되었지만 클라이언트와 서버가 독립적으로 작동합니다.

123

다음과 같은 C로 네트워크 채팅 클라이언트를 구현했습니다.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdbool.h"
#include "sys/socket.h"
#include "sys/types.h"
#include "netdb.h"
#include "netinet/in.h"
#include "pthread.h"
#include "errno.h"

#define MESSAGE_BUFFER 500
#define USERNAME_BUFFER 10

typedef struct {
    char* prompt;
    int socket;
} thread_data;


// Connect to server
void * connect_to_server(int socket_fd, struct sockaddr_in *address) {
    int response = connect(socket_fd, (struct sockaddr *) address, sizeof *address);
    if (response < 0) {
        fprintf(stderr, "socket() failed: %s\n", strerror(errno));
        printf("Failed to connect\n");
        exit(1);
    } else {
      printf("Connected\n");
    }
}

// Get message from stdin and send to server
void * send_message(char prompt[USERNAME_BUFFER+4], int socket_fd, struct sockaddr_in *address) {
  printf("%s", prompt);
  char message[MESSAGE_BUFFER];
  char final_message[MESSAGE_BUFFER+USERNAME_BUFFER+1];
  while (fgets(message, MESSAGE_BUFFER, stdin) != NULL) {
      memset(final_message,0,strlen(final_message)); // Clear final message buffer
      strcat(final_message, prompt);
      strcat(final_message, message);
      printf("\n%s", prompt);
      if (strncmp(message, "/quit", 5) == 0) {
        printf("Closing connection...\n");
        exit(0);
      }
      sendto(socket_fd, final_message, MESSAGE_BUFFER+USERNAME_BUFFER+1, 0, (struct sockaddr *) &address, sizeof address);
  }
}

void * receive(void * threadData) {
    int socket_fd, response;
    char message[MESSAGE_BUFFER];
    thread_data* pData = (thread_data*)threadData;
    socket_fd = pData->socket;
    char* prompt = pData->prompt;
    memset(message, 0, MESSAGE_BUFFER); // Clear message buffer

    // Print received message
    while(true) {
        response = recvfrom(socket_fd, message, MESSAGE_BUFFER, 0, NULL, NULL);
        if (response) {
            printf("\nServer> %s", message);
            printf("%s", prompt);
            fflush(stdout); // Make sure "User>" gets printed
        }
    }
}

int main(int argc, char**argv) {
    long port = strtol(argv[2], NULL, 10);
    struct sockaddr_in address, cl_addr;
    char * server_address;
    int socket_fd, response;
    char prompt[USERNAME_BUFFER+4];
    char username[USERNAME_BUFFER];
    pthread_t thread;

    // Check for required arguments
    if (argc < 3) {
        printf("Usage: client ip_address port_number\n");
        exit(1);
    }

    // Get user handle
    printf("Enter your user name: ");
    fgets(username, USERNAME_BUFFER, stdin);
    username[strlen(username) - 1] = 0; // Remove newline char from end of string
    strcpy(prompt, username);
    strcat(prompt, "> ");

    server_address = argv[1];
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr(server_address);
    address.sin_port = port;
    socket_fd = socket(AF_INET, SOCK_STREAM, 0);

    connect_to_server(socket_fd, &address);

    // Create data struct for new thread
    thread_data data;
    data.prompt = prompt;
    data.socket = socket_fd;

    // Create new thread to receive messages
    pthread_create(&thread, NULL, receive, (void *) &data);

    // Send message
    send_message(prompt, socket_fd, &address);

    // Close socket and kill thread
    close(socket_fd);
    pthread_exit(NULL);
    return 0;
}

이것은 내가 작성한 서버에서 완벽하게 작동합니다. 그러나 다른 언어로 된 서버 나 다른 사람이 작성한 서버와 잘 어울리게 만들려고하면 상황이 무너지고 연결을 설정할 수 없습니다. 이들은 서로 독립적으로 작동해야하지 않습니까? 둘 다 따로 작동하면 내가 모은 것부터 함께 작동해야합니다.

예를 들어, 이 질문 에 대한 답변에서 서버와 함께 클라이언트를 사용하려고하면 더 이상 작동하지 않습니다. 나는 두 가지를 모두 테스트했으며 함께가 아니라 개별적으로 잘 작동합니다. stderr연결할 때 의 출력을 보았지만 Connection refused더 이상 정보가없는 오류 만 표시됩니다.

이것들이 함께 작동하도록 노력하면서 내가 놓친 명백한 것이 있습니까? 누군가가 내 클라이언트가 예제 서버와 함께 작동하는 방법을 보여줄 수 있다면 매우 유용 할 것입니다.

user207421
address.sin_port = port;

문제가 여기에 있습니다. 그것은해야한다

address.sin_port = htons(port);

클라이언트와 서버 모두에서.

다른 문제가 있습니다.

fprintf(stderr, "socket() failed: %s\n", strerror(errno));

이것은

fprintf(stderr, "connect() failed: %s\n", strerror(errno));

그때:

sendto(socket_fd, final_message, MESSAGE_BUFFER+USERNAME_BUFFER+1, 0, (struct sockaddr *) &address, sizeof address);

다음과 같아야합니다.

send(socket_fd, final_message, strlen(final_message)+1, 0);

당신은 필요가 없습니다 sendto()당신이 이미 연결되어있는, 당신은 뒤에 널 이외에는 아무 것도 보낼 필요가 없습니다. 사실 전체 방법을 다음과 같이 줄일 수 있습니다.

void * send_message(char prompt[USERNAME_BUFFER+4], int socket_fd, struct sockaddr_in *address) {
  printf("%s", prompt);
  char message[MESSAGE_BUFFER];
  while (fgets(message, MESSAGE_BUFFER, stdin) != NULL) {
      if (strncmp(message, "/quit", 5) == 0) {
        printf("Closing connection...\n");
        close(socket_fd);
        exit(0);
      }
      send(socket_fd, prompt, strlen(prompt), 0);
      send(socket_fd, message, strlen(message)+1, 0);
      printf("\n%s", prompt);
  }

}

그때:

  if (response) {
        printf("\nServer> %s", message);
        printf("%s", prompt);
        fflush(stdout); // Make sure "User>" gets printed
    }

다음과 같아야합니다.

  if (response == -1) {
    fprintf(stderr, "recv() failed: %s\n", strerror(errno));
    break;
  } else if (response == 0) {
        printf("\nPeer disconnected\n");
        break;
  } else {
        printf("\nServer> %s", message);
        printf("%s", prompt);
        fflush(stdout); // Make sure "User>" gets printed
  }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

FTP 클라이언트 소켓 프로그램에서 연결이 거부되었습니다.

분류에서Dev

Nginx SSL 연결이 거부되었지만 로컬에서 작동합니다.

분류에서Dev

클라이언트가 서버 C와 연결되지 않음 (소켓 프로그래밍)

분류에서Dev

서버가 새 연결을 수락하지 않고 백 로그 크기가 0 인 경우에도 Python 클라이언트 소켓이 연결됩니다.

분류에서Dev

소켓 서버가 실행 중이지만 클라이언트가 연결할 수 없습니다.

분류에서Dev

C # 소켓 서버와 PHP 클라이언트 소켓 연결

분류에서Dev

TCP 소켓 서버 클라이언트 연결 fd로 인해 메모리 누수가 발생합니까?

분류에서Dev

TCP를 통해 안드로이드 (소켓 클라이언트)를 C ++ (소켓 서버)와 연결

분류에서Dev

Python 서버에 대한 C ++ 소켓 클라이언트 연결이 생성되지 않았습니다.

분류에서Dev

서브 서버 소켓이 다운되는 동안 ZMQ 펍 클라이언트 소켓이 메시지를 버퍼로 만들려면

분류에서Dev

소켓 IO-서버가 내 반응 클라이언트와 연결되지 않음

분류에서Dev

FIXED : C ++ 서버 / 클라이언트 프로그램 : "연결이 거부되었습니다."

분류에서Dev

Errno 111 Python 소켓 프로그래밍에서 연결이 거부되었습니다.

분류에서Dev

Java-서버와 클라이언트가 상호 작용하지 않음 (소켓)

분류에서Dev

소켓 오류 : [Errno 111] Ubuntu에서 연결이 거부되었습니다.

분류에서Dev

파이썬 소켓 클라이언트는 하나의 반복에 대해서만 작동합니다

분류에서Dev

Android 소켓 클라이언트 readUTF가 작동하지 않음

분류에서Dev

클라이언트-서버를 웹 소켓과 연결할 수 없습니다.

분류에서Dev

서버 소켓 errno 57-소켓이 연결되지 않았습니다.

분류에서Dev

클라이언트 소켓과 서버 소켓 연결 문제

분류에서Dev

CSS Padding은 다음과 함께 작동합니다 : 선택자 이후-주 요소에서 독립적으로 작동하도록 만드는 방법

분류에서Dev

TCP 소켓 프로그램에서 클라이언트는 일부 데이터를 보내지 만 서버는 여러 번 읽어야합니다. 왜?

분류에서Dev

SSH 연결이 외부 적으로 시간 초과되었지만 내부적으로 작동합니다.

분류에서Dev

동일한 포트가 클라이언트와 서버로 작동합니까?

분류에서Dev

socket.io-client가 XSockets.NET 서버의 소켓 클라이언트로 적합합니까?

분류에서Dev

클라이언트가 연결을 요청했지만 "메시지를 보낼 수 없음"시 Android 소켓이 "연결됨"으로 표시됨

분류에서Dev

onActivityResult () 내부에서 TCP 클라이언트 소켓이 작동하지 않음

분류에서Dev

파이썬에서 지속적으로 실행되는 소켓 클라이언트를 만드는 방법

분류에서Dev

클라이언트가 서버 소켓 연결을 기다리게하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    FTP 클라이언트 소켓 프로그램에서 연결이 거부되었습니다.

  2. 2

    Nginx SSL 연결이 거부되었지만 로컬에서 작동합니다.

  3. 3

    클라이언트가 서버 C와 연결되지 않음 (소켓 프로그래밍)

  4. 4

    서버가 새 연결을 수락하지 않고 백 로그 크기가 0 인 경우에도 Python 클라이언트 소켓이 연결됩니다.

  5. 5

    소켓 서버가 실행 중이지만 클라이언트가 연결할 수 없습니다.

  6. 6

    C # 소켓 서버와 PHP 클라이언트 소켓 연결

  7. 7

    TCP 소켓 서버 클라이언트 연결 fd로 인해 메모리 누수가 발생합니까?

  8. 8

    TCP를 통해 안드로이드 (소켓 클라이언트)를 C ++ (소켓 서버)와 연결

  9. 9

    Python 서버에 대한 C ++ 소켓 클라이언트 연결이 생성되지 않았습니다.

  10. 10

    서브 서버 소켓이 다운되는 동안 ZMQ 펍 클라이언트 소켓이 메시지를 버퍼로 만들려면

  11. 11

    소켓 IO-서버가 내 반응 클라이언트와 연결되지 않음

  12. 12

    FIXED : C ++ 서버 / 클라이언트 프로그램 : "연결이 거부되었습니다."

  13. 13

    Errno 111 Python 소켓 프로그래밍에서 연결이 거부되었습니다.

  14. 14

    Java-서버와 클라이언트가 상호 작용하지 않음 (소켓)

  15. 15

    소켓 오류 : [Errno 111] Ubuntu에서 연결이 거부되었습니다.

  16. 16

    파이썬 소켓 클라이언트는 하나의 반복에 대해서만 작동합니다

  17. 17

    Android 소켓 클라이언트 readUTF가 작동하지 않음

  18. 18

    클라이언트-서버를 웹 소켓과 연결할 수 없습니다.

  19. 19

    서버 소켓 errno 57-소켓이 연결되지 않았습니다.

  20. 20

    클라이언트 소켓과 서버 소켓 연결 문제

  21. 21

    CSS Padding은 다음과 함께 작동합니다 : 선택자 이후-주 요소에서 독립적으로 작동하도록 만드는 방법

  22. 22

    TCP 소켓 프로그램에서 클라이언트는 일부 데이터를 보내지 만 서버는 여러 번 읽어야합니다. 왜?

  23. 23

    SSH 연결이 외부 적으로 시간 초과되었지만 내부적으로 작동합니다.

  24. 24

    동일한 포트가 클라이언트와 서버로 작동합니까?

  25. 25

    socket.io-client가 XSockets.NET 서버의 소켓 클라이언트로 적합합니까?

  26. 26

    클라이언트가 연결을 요청했지만 "메시지를 보낼 수 없음"시 Android 소켓이 "연결됨"으로 표시됨

  27. 27

    onActivityResult () 내부에서 TCP 클라이언트 소켓이 작동하지 않음

  28. 28

    파이썬에서 지속적으로 실행되는 소켓 클라이언트를 만드는 방법

  29. 29

    클라이언트가 서버 소켓 연결을 기다리게하는 방법은 무엇입니까?

뜨겁다태그

보관