Гость Опубликовано 18 января, 2003 Жалоба Опубликовано 18 января, 2003 При изчении работы с сокетами я пользовался одними линуксовыми мануалками и не совсем понял как считывать информацию с сокета . Ну да с помощью 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; } Цитата
Гость Опубликовано 12 февраля, 2003 Жалоба Опубликовано 12 февраля, 2003 Я вот тоже с Линуксом около двух недель, однако в теме просмотра видео у меня проблем не возникло... достаточно найти новый 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 Цитата
Гость Опубликовано 19 февраля, 2003 Жалоба Опубликовано 19 февраля, 2003 А не работает потому как мааленькая такая ошибочка // accept возвращает дескр. в которым в дальнейшем надо работать acep = accept(sock, (struct sockaddr*)&addr, &size); // и дальнешие чтение/запись идет уже не в sock а в acep // sock остается для приема соединений rec = recv(acep, msg, 1000, 0); printf("%x\n", msg); Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.