Проблема клиентского сервера с connect () или accept () - PullRequest
0 голосов
/ 15 апреля 2010

все. У меня немного странная проблема с клиент-серверной программой. У меня есть два разных типа клиентов, пытающихся подключиться к одному серверу, один просто более скромный, чем другой, с меньшим количеством дел. Но в остальном они практически одинаковы. В то время как код barebone может подключаться к серверу, и сервер хорошо его принимает, сложная версия этого не может. Клиент говорит, что он подключен, отправляет сообщения (через send () и sendto ()) и получает количество отправленных байтов. Но сервер не распознает это. Я не совсем уверен, почему, особенно при сравнении обеих версий клиентов, они на самом деле одно и то же (по крайней мере, пока не вызывается connect ()), сложная версия имеет bind (), а версия barebone - нет. Кто-нибудь может увидеть проблему, почему эти очень похожие коды не работают одинаково: P

    if (argc == 3)
{
    host = argv[1];         // server address
    info.c_name = argv[2];
}
else
{
    printf("plz read the manual, kthxbai\n");
    exit(1);
}

hp = gethostbyname(host);
if (!hp)
    exit(1);
printf("host found\n");

// setting up address and port structure information
bzero((char * ) &server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(SERVER_PORT);


// opening up socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
    exit(1);
else
    printf("socket is opened: %i \n", sockfd);
info.sock_fd = sockfd;


// binding socket to a port: not in barebone version
rv = bind(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
if (rv < 0)
{
    printf("MAIN: ERROR bind() %s\n", strerror(errno));
    exit(1);
}
else
    printf("socket is bound\n");

// connecting
rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
printf("rv = %i\n", rv);
if (rv < 0)
{
    printf("MAIN: ERROR connect() %i:  %s\n", errno, strerror(errno));
    exit(1);
}
else
    printf("connected\n");

Я даже не уверен, в чем проблема, это сложная версия клиента или просто сервер? Спасибо за любое просвещение.

1 Ответ

1 голос
/ 15 апреля 2010

Если код действительно то, что вы используете, ваш клиент (волшебным образом) подключается к самому себе из-за немного неясной TCP Одновременное подключение поддержка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...