сокеты Беркли, работающие с простым соединением клиента и сервера - PullRequest
0 голосов
/ 10 февраля 2012

Я только начинаю заниматься сетевым программированием в c.Я следовал простому руководству по созданию сервера, который принимает соединение и распечатывает сообщение, отправленное клиентом.

клиент принимает аргумент в качестве адреса сервера.

ЯНе знаете, как указать адрес сервера?Это имя моей машины?

Я запускаю сервер в одном терминале и пытаюсь подключиться с другого.Спасибо за любую помощь:)

вот код сервера

   `#include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include<stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>

    int main(int argc, char *argv[])
    {
    #define BUFLEN 1500
    int fd;
    ssize_t i;
    ssize_t rcount;
    char buf[BUFLEN];

    printf("test1");
    fd = socket (AF_INET,SOCK_STREAM,0);
    if (fd == -1){
         printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
    }

    struct sockaddr_in addr;

    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(500);

    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        printf("cannot bind socket");
    }

    if (listen(fd, 20) == -1) {
       printf("unable to listen");
    }

    int connfd; 
    struct sockaddr_in cliaddr; 
    socklen_t   cliaddrlen = sizeof(cliaddr);


    connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen);
    if (connfd == -1) {
        printf("unable to accept");
    }




    rcount = read(fd, buf, BUFLEN);
    if (rcount == -1) {

    // Error has occurred
    }
    for (i = 0; i < rcount; i++) { 
        printf("%c", buf[i]);
    }

    }`

1 Ответ

1 голос
/ 10 февраля 2012
printf("test1");

Вы должны добавить "\ n" (символ новой строки) в конце напечатанной строки, чтобы она печаталась немедленно.Без "\ n" printf () буферизует свои выходные данные, а вы их не видите.

addr.sin_port = htons(500);

Порты 0 - 1023 называются "хорошо известными портами" и резервируются для системы (root).Вы должны использовать порт 1024 или выше для такой тестовой программы.Изменение его с 500 на 1500 (например) связывает успешно.(Вы не видите сообщение об ошибке «невозможно связать сокет», потому что у него нет «\ n», как я сказал выше.)

rcount = read(fd, buf, BUFLEN);

Вы должны читать из connfd, а не из fd.С этими изменениями это сработало для меня.(Я использовал "telnet localhost 1500" в качестве клиента.)

...