Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2009, 11:54   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
Восклицание socket

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

Код:
...
SOCKET CreateSocket(sockaddr_in);
WSAStartup(WS_VERSION_REQD, &stWSAData);
sock1 = socket(AF_INET, SOCK_STREAM,0);
WSAAsyncSelect(sock1,0,WM_ASYNC, FD_ACCEPT | FD_READ);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons (port1);
bind(soc1k,(LPSOCKADDR)&addr,sizeof(struct sockaddr));

listen(sock1,5);
lenaddr=sizeof(addr);
sock1=accept(sock1,(LPSOCKADDR)&addr,&lenaddr);
recv(sock1,buf,100,0);
closesocket(sock1);

listen(sock1,5);
lenaddr=sizeof(addr);
sock1=accept(sock1,(LPSOCKADDR)&addr,&lenaddr);
recv(sock1,buf,100,0);
closesocket(sock1);
...
Артэс вне форума Ответить с цитированием
Старый 22.06.2009, 14:31   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Во-первых, у вас ошибки в коде
bind вы делаете для сокета soc1k, а listen для sock1.
Во-вторых, когда вы создаете сокет, это один сокет. А когда вы устанавливаете соединение, то это другой сокет. Вам нужно закрывать именно соединение, а не созданный сокет. Иначе сокет просто пропадет и все, слушать сервер уже не сможет.
Код:
SOCKET CreateSocket(sockaddr_in);
WSAStartup(WS_VERSION_REQD, &stWSAData);
sock = socket(AF_INET, SOCK_STREAM,0);
WSAAsyncSelect(sock,0,WM_ASYNC, FD_ACCEPT | FD_READ);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons (port1);
bind(sock,(LPSOCKADDR)&addr,sizeof(struct sockaddr));

listen(sock,5);
lenaddr=sizeof(addr);
int conn;
conn=accept(sock1,(LPSOCKADDR)&addr,&lenaddr);
recv(conn,buf,100,0);
closesocket(conn);                //может использовать close()?

listen(sock,5);
lenaddr=sizeof(addr);
conn=accept(sock,(LPSOCKADDR)&addr,&lenaddr);
recv(conn,buf,100,0);
closesocket(conn);
Мои правки выделены красным.
MaTBeu вне форума Ответить с цитированием
Старый 22.06.2009, 17:22   #3
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Отлично! Спасибо большое! А я то мучался)

На счет ошибок, это ерунда, я просто каряво скопировал код. А вот то что я закрывал сокет, а не соединение, в этом и была проблема значит... не знал. Еще раз спасибо)
Артэс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SoCket и списки Demol Работа с сетью в Delphi 2 22.03.2009 18:16
Socket в Dev C++ Артэс C/C++ Сетевое программирование 1 11.01.2009 23:00
Socket Get Editor Работа с сетью в Delphi 7 22.04.2008 05:48
Socket vs Stream JoanM Работа с сетью в Delphi 1 01.04.2008 10:10
Socket Delphi 7 merax Работа с сетью в Delphi 1 09.02.2007 10:32