Программирование сокетов для начинающих на C - PullRequest
1 голос
/ 26 апреля 2011

Я только начал изучать программирование сокетов и нахожу это довольно интересным. В настоящее время я делаю сервер и клиент на одном компьютере, и, следовательно, я могу иметь IP-адрес в качестве адреса обратной связи, 127.0.0.1, и все, кажется, работает нормально !!

Но теперь я думал о том, чтобы иметь два компьютера и делать это .. У меня есть следующие вопросы - 1) Скажем, один компьютер - сервер, а другой - клиент. Теперь, должен ли серверный код находиться на сервере, а клиентский код на клиентском? 2) В коде сервера, когда мы предоставляем ip-адрес для bind (), это должен быть ip-адрес системы, который мы можем найти через ipconfig, или он должен оставаться адресом обратной связи ?? 3) Я полагаю, что в коде клиента IP-адрес получателя должен совпадать с IP-адресом серверного компьютера. 4) И последнее и самое важное, КАК ПОДКЛЮЧИТЬ ДВЕ КОМПЬЮТЕРА ??

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

КОД СЕРВЕРА

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

#define MYPORT 3500

int main()
{
    int sockfd;
    int clientfd;
    int bytes_read;
    char buf[100];
    int struct_size;
    struct sockaddr_in my_addr;
    struct sockaddr_in con_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(MYPORT);
    my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    my_addr.sin_zero[8]='\0';

    bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

    listen(sockfd,5);

    struct_size = sizeof(con_addr);
    clientfd = accept(sockfd, (struct sockaddr*)&con_addr, &struct_size);

    bytes_read = read(clientfd, buf, 100);
    buf[bytes_read] = '\0';
    printf("Message from client:%d is %s \n",clientfd, buf);

    close(sockfd);
    close(clientfd);
}

КОД КЛИЕНТА

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<string.h>
#include<stdio.h>

#define DESTPORT 3500

int main()
{

    struct sockaddr_in dest_addr;

    int sockfd = socket(AF_INET,SOCK_STREAM,0);

    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(DESTPORT);
    dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    dest_addr.sin_zero[8]='\0';

    connect(sockfd,(struct sockaddr*)&dest_addr, sizeof(struct sockaddr));

    char msg[100];
    printf("Enter you message: ");
    gets(&msg); 

    int w = write(sockfd, msg, strlen(msg));

    close(sockfd);
    printf("Client Dying.....\n"); 

    return 0;
}

Ответы [ 4 ]

2 голосов
/ 26 апреля 2011

1) Правильно.

2) На стороне сервера вы можете привязать к 0.0.0.0, что означает «все (IPv4) интерфейсы».

3) Да, вы правы.

4) Чаще всего через коммутатор Ethernet (или перекрестный кабель Ethernet, но их труднее найти).

1 голос
/ 26 апреля 2011

Сервер должен bind до 0.0.0.0 (любой), если вы не пытаетесь ограничить доступ (и в этом случае вы должны использовать брандмауэр, а не привязку порта). Правильный путь на самом деле:

struct addrinfo *ai, hints = { .ai_flags = AI_PASSIVE };
if (getaddrinfo(0, "1234", &hints, &ai)) goto error;
int fd = socket(ai->ai_family, SOCK_STREAM, 0);
bind(fd, ai->ai_addr, ai->ai_addrlen);

Конечно, добавьте проверку ошибок. Замените «1234» на номер вашего порта.

0 голосов
/ 24 февраля 2012

1) Скажем, один компьютер - сервер, а другой - клиент.Теперь, должен ли серверный код находиться на сервере, а клиентский код на клиентском?

Не думаю, что я понимаю это в правильной перспективе ... lol.Если ваш клиентский код находится на стороне сервера, как вы могли бы выделить какие-либо участки памяти или вызвать что-то на клиентском компьютере?

2) В коде сервера, когда мы предоставляем ip-адрес для bind (), это должен быть ip-адрес системы, который мы можем найти через ipconfig, или он должен оставаться адресом обратной связи ??

что мы имеем на странице man:

 int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

"bind () назначает адрес, указанный в addr, сокету, указанному дескриптором файла sockfd.addrlen указывает размер в байтах структуры адреса, на которую указывает addr. Традиционно эта операция называется «назначением имени сокету». Обычно необходимо назначить локальный адрес с помощью bind (), прежде чем сокет SOCK_STREAM можетполучать соединения (см. accept (2)). "

В вашем случае, я полагаю, 127.0.0.1 - это то, что вы ищете. В двух словах, адрес, о котором вы говорили, скорее всего будетВы устанавливаете структуру server_addr.

3) Я полагаю, что в коде клиента IP-адрес получателя должен быть адресом серверного компьютера, верно ??

Да.

4) И последнее и самое важное, КАК ПОДКЛЮЧИТЬ ДВА КОМПЬЮТЕРА ??

Походит на классическое приложение для чата.Насколько я знаю (я новичок ...), программирование и API UDP (User Datagram Protocol) стоит попробовать, вероятно. Если вы хотите придерживаться TCP / IP, два произвольных компьютера по существу не подключаются к каждомудругие, но оба держатся за сервер, и сервер станет краеугольным камнем между ними.

Более того, я заглянул в страницу руководства по сокетам:

 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

«Системный вызов connect () соединяет сокет, на который ссылается дескриптор файла sockfd, с адресом, указанным в addr. Аргумент addrlen указывает размер адреса. Формат адреса в адресе определяется адресным пространством сокета.sockfd; см. socket (2) для более подробной информации. "

Я думаю, что это объясняет ваш вопрос теоретически.

0 голосов
/ 26 апреля 2011

127.0.0.1 - это localhost адрес обратной связи для машины, на которой вы сейчас находитесь.Возможно, вы захотите изменить это на настоящий ip в клиенте, если вы используете два отдельных блока.

Да, клиент обычно, но не всегда, находится на другом физическом блоке с сервера.Вы можете просто запустить обе части на omne box, если хотите

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