0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
1

Путаница в работе socket

29.04.2009, 07:29. Показов 4466. Ответов 5
Метки нет (Все метки)

клиент и сервер. по отдельности c netcat'ом работают, a между собой вылезает ошибка в функции accept: accept: Bad file descriptor. подскажите где ошибка??
Server:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 #include <stdlib.h>
 2 #include <stdio.h>
 3 #include <linux/ip.h>
 4 #include <sys/socket.h>
 5 #include <sys/types.h>
 6 #include <netinet/in.h>
 7 #include <string.h>
 8 
 9 #define SRV_PORT 80
10 #define BUF_SIZE 64
11 
12 
13 void dbrun(char *buffer){
14         printf("hi%s",buffer);
15 //      strcpy(buf_send, buffer);
16 }
17 
18 int main(int argc, char* argv[]){
19         int listener,sock;
20         char buf[BUF_SIZE];
21         char *port;
22         struct sockaddr_in addr;
23         int bytes_read;
24 
25         if (argc == 2){
26                 port = argv[1];
27         } else if (argc == 1){
28                 port = "999";
29         } else {
30                 printf("Error: Format: ./server port\n");
31                 exit(1);
32         }
33 
34         printf("Start server...\n");
35         listener = socket(AF_INET, SOCK_STREAM, 0);
36         if (listener < 0){
37                 perror("socket");
38                 exit(1);
39         }
40 
41         memset(&addr, 0, sizeof(addr));
42         addr.sin_family = AF_INET;
43         addr.sin_port = htons(atoi(port));
44         addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
45 
46         if (bind(listener, (struct sockaddr*)&addr, sizeof(addr)) < 0){
47                 perror("bind");
48                 exit(2);
49         }
50 
51         listen(listener, 3);
52 
53         while (1){
54                 sock = accept(listener, NULL, NULL);
55                 if (sock < 0){
56                         perror("accept");
                            exit(3);
58                 }
59 
60                 while (1){
61                         memset(&buf, 0, sizeof(buf));
62                         bytes_read = recv(sock, buf ,250 , 0);
63                         if (bytes_read <= 0) break;
64                         dbrun(buf);
65                         printf("%s",buf);
66                         send(sock, buf, bytes_read, 0);
67                 }
68                 close(sock);
69         }
70 
71 return 0;
72 }
73
Client:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdlib.h>
 2 #include <stdio.h>
 3 #include <linux/ip.h>
 4 #include <sys/socket.h>
 5 #include <sys/types.h>
 6 #include <netinet/in.h>
 7 #include <string.h>
 8 
 9 #define SRV_PORT 34691
10 #define BUFFER   64
11 
12 int main(int argc, char* argv[]){
13 
14         int sd;
15         struct sockaddr_in addr;
16         char mess[BUFFER];
17         char str[250];
18         char buf[BUFFER];
19         char* p_mess;
20         char pr;
21 
22 //Create socket
23         sd = socket(AF_INET, SOCK_STREAM, 0);
24         if (sd < 0){
25                 perror("socket");
26                 exit(1);
27         }
28         memset(&addr, 0, sizeof(addr));
29         addr.sin_family = AF_INET;
30         addr.sin_port = htons(80);
31         addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
32         if (connect(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0){
33                 perror("connect");
34                 exit(2);
35         }
36 
37         while (1){
38                 scanf("%s", mess);
39 //              if (mess == 'q') break;
40                 memset(&str, 0, sizeof(str));
41 //              memset(&buf, 0, sizeof(buf));
42                 sprintf(str, "%s\n", mess);
43                 send(sd, str, sizeof(str), 0);
44 //              recv(sd, buf, sizeof(buf), 0);
45                 printf(buf,"\n");
46         }
47         close(sd);
48 
49 
50 return 0;
51 }
Добавлено через 1 минуту 42 секунды
Причем сервер успевает напечатать первую передачу и затем bad file descriptor
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2009, 07:29
Ответы с готовыми решениями:

Путаница в работе Object.toString()
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#toString() Открываем...

Невозможно создать Socket: Socket sock = new Socket(someHostString,somePortInt);
Народ! Помогите пожалуйста. Вся красота губится на exception что выскакивает в момент создания...

Постоянная утечка память при работе с System.Net.Sockets.Socket. В чем может быть дело? Код прилагаю
Собственно отправка и получение данных, внутри Метод, возвращающий true или false namespace...

Посоветуйте i5-7600 (Socket 1151) или i7-6800 (Socket 2011-3)
Посоветуйте, что взять i7-7700 (Socket 1151) или i7-6800 (Socket 2011-3) материнки на Z270 и на...

5
Evg
Эксперт CАвтор FAQ
21265 / 8281 / 637
Регистрация: 30.03.2009
Сообщений: 22,638
Записей в блоге: 30
29.04.2009, 08:11 2
Сразу небольшой совет.
printf свои выдачи буфферизует, а потому в общем случае на экран они выдаюися не сразу. При этом если программа фатально навернулась, то эта выдача на экран уже впринципе не попадёт. Поэтому в таких случаях вместо printf ("aaa"); пиши fprintf (stderr, "aaa"); или в две операции printf ("aaa"); fflush (stdout);
И на всякий случай в конце каждой печати лепи энтер (в dbrun у тебя печать без энтера, что сильно повышает вероятность того, что в фатальном случае печать ты не увидишь)

Добавлено через 1 минуту 57 секунд
> send(sd, str, sizeof(str), 0);
Правильнее было бы вместо sizoef(str) писать strlen(str) - тебе же нужно только "полезную" часть строки послать, мусор, который есть в конце буффера слать не нужно
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
29.04.2009, 08:13  [ТС] 3
да это просто уже экспериментальные версии. Тырканья что называется. Не могу отыскать где баг. ПРичем работало все вчера вечером. У меня ощущение что просто в Vim что-то нажал и либо удалилось что-то или добавилось, хотя не знаю. Уже нервы на пределе. Тысячу раз перепроверил. так все равно не пашет. Хотя с другой сторона как с Netcat'ом все нормально. Не понимаю....
0
Evg
Эксперт CАвтор FAQ
21265 / 8281 / 637
Регистрация: 30.03.2009
Сообщений: 22,638
Записей в блоге: 30
29.04.2009, 08:15 4
Приду на работу - попробую запустить, если время будет
А Netcat это что?

Если вылетает accept, то скорее всего из-за того, что в первый раз он отрабатывает после listen, а второй раз отрабатывает в воздухе. Может надо listen вовнутрь цикла засунуть?
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
29.04.2009, 08:15  [ТС] 5
ВСЕ. Спасибо большое. С strlen заработало. фууу. терь осталось разобраться в чем была проблемма)))
0
Evg
Эксперт CАвтор FAQ
21265 / 8281 / 637
Регистрация: 30.03.2009
Сообщений: 22,638
Записей в блоге: 30
29.04.2009, 10:27 6
По поводу strlen
В это случа после
bytes_read = recv(sock, buf ,250 , 0);
надо добавить buf[bytes_read] = 0;
Т.е. ты в буффер сначала считал "чистые данные", за которыми надо принудительно нолик записать
Или в момент отправки писать strlen(str) + 1

То, что с strlen'ом заработало - это как-то странно
Глазами код посмотрел - вроде бы должно работать так, как ты делал
Единственная теория, почему оно могло не работать - read'ом у тебя за раз считалось не всё сообщение, а только кусочек (по-честному read'ом надо в цикле вроде бы как читать). Хотя в случае передачи внутри машины это маловероятно

Добавлено через 1 час 59 минут 33 секунды
Запустил на работе. Сервер выдаёт ошибку "bind: Permission denied"
Видимо у нас настроено так, что нельзя серверы-демоны запускать (типа безопасность и всё такое)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2009, 10:27
Помогаю со студенческими работами здесь

Assembler linux. Socket recv and socket send invalid arguments
Пишу шеллкод. Он ожидает подключения с 2222 порта, сам подключается на 1111 порт, выделяет память,...

Совместимость AMd athlon 2 x2 245 socket am3 к материнке ht2000 k8m890m-m socket am2
Подойдет ли проц AMd athlon 2 x2 245 socket am3 к материнке ht2000 k8m890m-m socket am2

Nodejs net socket server and android socket client
Добрый день Форумчане нужно помощь гуру! Решил с другом написать сервер на ноде с использование...

Windows socket server python + socket client js
Здравствуйте пытаюсь решить такую задачу, на веб странице реализовал soket клиент на js, и socket...

Server Socket, Asynchronous socket error 10053
Всем привет. Сразу к делу. Работаю с компонентом ServerSocket, при приеме данных возникает...

Socket Android Client and Java Socket Server
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение. Клиент - приложение на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru