Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

При изчении работы с сокетами я пользовался одними линуксовыми мануалками и не совсем

понял как считывать информацию с сокета . Ну да с помощью recv но чето не то. В с я новичок и с проблемой разобраться никак не могу...

вот листинг не доработанной проги которая создает соке в ожидании соединения и всю поступающую информацию должна вывоодить на экран

(если будет закончена):

#include

#include

#include

#include

#include

int main()

{

int sock;

char in[10];

int list;

int bin;

int acep;

int size;

int rec;

char msg[1000];

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = inet_addr( "127.0.0.1");

addr.sin_port = htons(12345);

size = sizeof(addr);

sock = socket(AF_INET, SOCK_STREAM, 0);

bin = bind(sock, (struct sockaddr*)&addr, 32);

list = listen(sock, 5);

acep = accept(sock, (struct sockaddr*)&addr, &size);

rec = recv(sock, msg, 1000, 0);

printf("%x\n", msg);

}

Конечно же прога не работает тоесть она выводит на экран содержание пакета с запросом на соединение (bffff6a0) и закрывает сокет.

Может надо использовать select и при изменение буфера msg выводить его на экран ? Тогда придется снова recv пукать? или использовать read?

Но в таком случае у меня пишеться что

файловый дескриптор (sock) не работает или чтото в этом роде. Да и select при компиляции ошибки выдает.

Вы уж помогиет!!! Если можно представте нехватающий кусочек кода... Должно получиться чтото типа talk

(все входящии сообщения посылаються на экран).

Помогите буду очень благодарен!!! Да для отсылки сообщения я использую send ( предварительно соеденившись с сокетом).

вот программа клиент:

#include stdio.h

#include stdlib.h

#include

#include

#include

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

{

int sock;

char pack[] = "Hello\n";

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = inet_addr( "127.0.0.1");

addr.sin_port = htons(12345);

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

connect(sock, (struct sockaddr*)&addr, sizeof(addr));

M1: scanf("%s", &pack);

send (sock, pack, sizeof(pack), 0);

goto M1;

}

  • 4 недели спустя...
Опубликовано

Я вот тоже с Линуксом около двух недель, однако в теме просмотра видео у меня проблем не возникло... достаточно найти новый xine или mplayer... без всяких проблем смотришь и divx'овский MPEG4, и WMV... А винда слишком костлява и неповоротлива, чтобы быть хорошей для рабочей станции %)Это мой типовой набор процедурок для TCP/IP сервера

Нет полько основной занимающейся самой обработкой запросов.УДАЧИ

void

set_address (char *hname, char *sname,

struct sockaddr_in *sap, char *protocol)

{

struct servent *sp;

struct hostent *hp;

char *endpnt;

short port;

bzero (sap, sizeof (*sap));

sap->sin_family = AF_INET;

if (hname != NULL)

{

if (!inet_aton (hname, &sap->sin_addr))

{

hp = gethostbyname (hname);

if (hp == NULL)

fprintf (stderr, "Неизвестный хост: %s\n", hname);

sap->sin_addr = *(struct in_addr *) hp->h_addr;

}

}

else

sap->sin_addr.s_addr = htonl (INADDR_ANY);

port = strtol (sname, &endpnt, 0);

if (*endpnt == '\0')

sap->sin_port = htons (port);

else

{

sp = getservbyname (sname, protocol);

if (sp == NULL)

fprintf (stderr, "Неизвестный сервис: %s\n", sname);

sap->sin_port = sp->s_port;

}

}

void get_connect(){

socklen_t peerlen;

peerlen = sizeof (peer);

s1 = accept (s, (struct sockaddr *) &peer, &peerlen);

if (!isvalidsock (s1))

fprintf (stderr, "Ошибка вызова accept\n");

}

void

tcp_serv (char *hname, char *sname)

{

struct sockaddr_in local;

const int on = 1;

if(shutdown(s,2)<1)perror("Shutdown socket");

//if(close(s)<1)perror("Close socket");

set_address (hname, sname, &local, "tcp");

s = socket (AF_INET, SOCK_STREAM, 0);

if (!isvalidsock (s))

fprintf (stderr, "Ошибка вызова Порта Socket\n");

if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)))

fprintf (stderr, "Ошибка вызова setsockaddr\n");

if (bind (s, (struct sockaddr *) &local, sizeof (local)))

perror("bind");

if (listen (s, SOMAXCONN))

fprintf (stderr, "Ошибка вызова Листа listen \n");

get_connect();

}

int

main (int argc, char **argv)

{

INIT ();

if (argc == 2)

{

hname = NULL;

sname = argv[1];

}

else if (argc != 1)

{

hname = argv[1];

sname = argv[2];

}

cout << "\nWin-Pak Message Redirector for Linux\nVersion " << VERSION <<

endl;

cout << "Copyright : © 2002 by Wizard Research Labs

Опубликовано

А не работает потому как мааленькая такая ошибочка

// accept возвращает дескр. в которым в дальнейшем надо работать

acep = accept(sock, (struct sockaddr*)&addr, &size);

// и дальнешие чтение/запись идет уже не в sock а в acep

// sock остается для приема соединений

rec = recv(acep, msg, 1000, 0);

printf("%x\n", msg);

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...