Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с клиент - сервер приложением

54K
15 ноября 2009 года
pihto
1 / / 15.11.2009
есть клиент - сервер приложение. проблема в том что при дисконекте клиента на сервер от клиента прилетает какойто мусор. помогите разобраться
сервер
Код:
#include <stdio.h>
#include <iostream>
#include <winsock2.h>

DWORD WINAPI ThreadFunc(LPVOID s1)
{
    SOCKET s2=((SOCKET *) s1)[0];
    char buf[100];
    recv(s2,buf,100,0);
    std::cout<<buf;
    send(s2,buf,100,0);
    closesocket(s2);
    return 0;
}

int main(){
 
WSADATA WsaData;
        struct sockaddr_in local;
        int s;
        int rc;
                int err = WSAStartup (0x0101, &WsaData);
        if (err == SOCKET_ERROR)
        {
           printf ("WSAStartup() failed: %ld\n", GetLastError ());
           return 1;
        }
 
        local.sin_family = AF_INET;
        local.sin_port = htons(7500);
        local.sin_addr.s_addr = htonl(INADDR_ANY);
        s = socket(AF_INET,SOCK_STREAM,0);
        SOCKET s1;
        if (s<0){
                perror("socket error");
                exit(1);
        }else{
                std::cout<<"Create sock: OK\n";
           }
        rc = bind(s,(struct sockaddr*)&local, sizeof(local));
if (rc<0){
                perror("bind error");
                exit(1);
        }else{
                std::cout<<"Bind: OK\n";
           }
 
           rc = listen(s,5);
           if(rc){
                   perror("listen error");
                exit(1);
           }else{
                std::cout<<"Listen: OK\n";
}
          int local2=sizeof(local);
while(1){
    s1=accept(s,0,0);
           DWORD thID;// thID идентификатор типа DWORD
      CreateThread(NULL,NULL,ThreadFunc,&s1,NULL,&thID);
 
}
return 0;
}


клиент
Код:
#include <stdio.h>
#include <iostream>
#include <winsock2.h>
int main(){
 
WSADATA WsaData;
        sockaddr_in peer;
        int s;
        int rc;
        int err = WSAStartup (0x0101, &WsaData);
        if (err == SOCKET_ERROR)
        {
           printf ("WSAStartup() failed: %ld\n", GetLastError ());
           return 1;
        }
while(true){
        peer.sin_family = AF_INET;
        peer.sin_port = htons(7500);
        peer.sin_addr.s_addr = inet_addr("127.0.0.1");
        s = socket(AF_INET,SOCK_STREAM,0);
        rc = connect(s,(sockaddr*)&peer, sizeof(peer));
char buf[100];
char buf2[100];
fgets(buf,100,stdin);
if(send(s,buf,100,0)!=0){
 
        std::cout<<"->Server: "<<buf;
}
        recv(s,buf2,100,0);
        std::cout<<"Server: "<<buf2<<"\n";
        closesocket(s);
}
return 0;
}
288
15 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: pihto

 
Код:
while(1){
    s1=accept(s,0,0);
           DWORD thID;// thID идентификатор типа DWORD
      CreateThread(NULL,NULL,ThreadFunc,&s1,NULL,&thID);
 
}
return 0;
}



Вы используете одну и ту же переменную и для работы в потоке и для того, чтобы принять новое соединение. Где гарантия, что пока поток работает с сокетом, основной поток не перезатрет s1, приняв новое соединение, и что будет тогда, вам не скажет никто.
Решение - сохранять сокеты для принятых соединений где-нибудь в контейнере.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог