Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

winsock в чем проблема?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> winsock в чем проблема?
Имя
Сообщение << Старые топики   Новые топики >>
winsock в чем проблема? - 2006-12-03 19:02:31.203333   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Я пишу клиентскую часть на с, вот код:
#define size_ans    20


using namespace std;
SOCKET client;

int send_(CString buf, long size)
{
    int mes = send(client, (LPCTSTR)buf, size, 0);
    if(mes == SOCKET_ERROR) // SOCKET_ERROR = -1
    {
        VERIFY(SOCKET_ERROR != closesocket(client));
        WSACleanup();
    }
    return mes;
}

int recv_(CString answer)
{
    int ans = recv(client, answer.GetBuffer(size_ans), size_ans, 0);
    answer.ReleaseBuffer();
    printf(answer);
    if(ans == SOCKET_ERROR)
    {
        VERIFY(SOCKET_ERROR != closesocket(client));
        WSACleanup();
    }
    return ans;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    WORD version;
    WSADATA  ImplDetal;
    int rlt;
    version = MAKEWORD(1, 1);
    rlt = WSAStartup(version, &ImplDetal);
    if(rlt != 0) return 1;
    char ip[] = "127.0.0.1";
    CString buf;
    CString answer;
    SOCKADDR_IN clientAddr;
    client = socket(PF_INET, SOCK_STREAM, 0); //PF_INET - use TCP; type - SOCK_STREAM; 0 - not atrib
    if(client == INVALID_SOCKET) return 1;
    clientAddr.sin_family = AF_INET; //struct internet
    clientAddr.sin_port = 32080; //port servera
    clientAddr.sin_addr.S_un.S_addr = inet_addr(ip); //ip servera
    connect(client, (LPSOCKADDR)&clientAddr, sizeof(clientAddr));
    buf = "123";
    int size = 3;
    if(send_(buf, size) == -1)
    {
        printf("don't send message!");
        return 1;
    }
    recv_(answer);
    return 0;   
}


В строке int mes = send(client, (LPCTSTR)buf, size, 0);
он не отсылает сообщение серверу.
Сервер на perl, тот же порт, висит на localhost.
Post #: 1
RE: winsock в чем проблема? - 2006-12-04 11:03:47.373333   
G@rd

Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
После сенда вставь строку printf(WSAGetLastError); результаты эта функция расшифровывает код ошибки, расшифровка в мсдне или тут http://www.westbyte.com/ida/index.phtml?page=faq_ec
Post #: 2
RE: winsock в чем проблема? - 2006-12-04 17:31:14.640000   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
А может проблема в неправильном ip, мне нужен ip localhost, но вроде 127.0.0.1 он и есть

Post #: 3
RE: winsock в чем проблема? - 2006-12-04 20:14:47.873333   
G@rd

Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
Так я не понял, у вас функция send данные отсылает или возвращает -1
Post #: 4
RE: winsock в чем проблема? - 2006-12-04 20:24:05.906666   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Пакеты до сервера не доходят, я попробовал WSAGetLastError функция вернула 10057
сложно сказать отсылает или нет.
Post #: 5
RE: winsock в чем проблема? - 2006-12-04 20:26:53.953333   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Я был прав, вот что эта ошибка значит:
Socket is not connected. A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error—for example, setsockopt setting SO_KEEPALIVE if the connection has been reset.
ip неверно указан.
попробую INADDR_ANY в поле хоста вставить.

Post #: 6
RE: winsock в чем проблема? - 2006-12-04 21:05:00.500000   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
мля, и так не получается! с той же ошибкой.
Post #: 7
RE: winsock в чем проблема? - 2006-12-04 21:22:12.250000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
а ты попробуй посмотреть что connect возвращает. если сокет нот коннектед, то вероятно эксепшн именно в connect случается, и именно его надо трактовать, а не последующие нот коннектед.
Post #: 8
RE: winsock в чем проблема? - 2006-12-04 22:14:48.810000   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Попробовал if(!connect(…) ) return 1;
проходит данную строку, но судя по всему проблема была в том что,
я указывал clientAddr.sin_port = 32080, а
надо clientAddr.sin_port = htons(32080); ф-ию htons не написал, может из-за этого.
Post #: 9
RE: winsock в чем проблема? - 2006-12-04 23:17:20.233333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
8|
NAME connect - initiate a connection on a socket SYNOPSIS #include &lt;sys/types.h&gt; #include &lt;sys/socket.h&gt; int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); [...] RETURN VALUE If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.
Post #: 10
RE: winsock в чем проблема? - 2006-12-05 19:43:57.323333   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
кажется
#include <sys/types.h>
 #include <sys/socket.h>
это linux, библиотеки, а я пишк на vc++, вроде эит библиотеки юзать не льзя.
Ну да ладно, я сделал if(connect(…) == SOCKET_ERROR) exit(1);
прога уже отправляет пакеты на сервер, но когда дохолит до приема данных, там останавливается, сервер должен после приняти пакета вывести на экран и отправить ответ.
Когда я ломаю соединение клиента, сервер выводит посланное сообщение и отваливается.
Post #: 11
RE: winsock в чем проблема? - 2006-12-05 20:50:40.670000   
G@rd

Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
Если я правильно понял, необходимо чтобы клиент не ждал приёма пакета а работал дальше, тогда необходимо перевести сокет в неблокирующий режим. Если вопрос почему сервер отваливается, то мы кода его не знаем, так как не телепаты.
Post #: 12
RE: winsock в чем проблема? - 2006-12-06 16:20:19.060000   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Вот код:
#!/usr/bin/perl

use IO::Socket;

my $port = 32080;
my $server = IO::Socket::INET->new(
LocalPort => $port,
Proto => 'tcp',
Listen => 10,
Reuse => 1)|| die "can't open port - $port === ($@)";
$new_sock = $server->accept();
while($mes = <$new_sock>)
{
    print $mes, "\n";
    print $new_sock "POST\n";
   # $dd = $$new_sock;
    #print "==>", $dd;
}
close $new_sock;
принял -> отослал, есть клиент тоже на perl там все замечательно пашет.
код:
#!/usr/bin/perl

use IO::Socket;

my $server_port = 32080;
my $server_host = 'localhost';

my $socket = IO::Socket::INET->new(
Proto => 'tcp',
PeerAddr => $server_host,
PeerPort => $server_port) || die "can't connect to $server_host === ($@)";
while($mes !~ /stop/g)
{
    $mes = <STDIN>;
    print $socket "$mes\n";
    my $answ = <$socket>;
    print "$server_host>$answ";
}
close $socket;

Post #: 13
RE: winsock в чем проблема? - 2006-12-06 18:17:43.970000   
G@rd

Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
К сожалению перл я не знаю(
Я не понял перл сервер выводит команду на экран или нет?
Хорошо было бы посмотреть данные общения в сети(по показаниям снифера) между клиентом на С и сервером, и клиентом на Перл с сервером.
Post #: 14
RE: winsock в чем проблема? - 2006-12-06 21:42:24.030000   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
В строке $mes = <$new_sock> скрипт чирает в $mes посланное сообщение->
print $mes, "\n"; выводит его на экран, и отправляет ответ клиенту print $new_sock "POST\n";
Что касается снифера я смотрел активность в outpost'e после того как мессага отправленна на сервер, он показывает что клинт отправил допустим 15byte, 0 принял. Пакеты идут.
Post #: 15
RE: winsock в чем проблема? - 2006-12-07 08:01:40.686666   
G@rd

Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
Вот строка принял 0 напрягает…. Судя по тому что клиент на С виснет он не получает данных.
 З.Ы. Я для отладки пользуюсь XSpider 6.50 Christmas Edition там есть функция TCP и UDP прокси сервера, которе показывают какие данные прошли по каналу и сообщения о соединении разрыве и т. д.
Post #: 16
RE: winsock в чем проблема? - 2006-12-07 19:13:24.046666   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Был где то XSpider, попробую…
Post #: 17
RE: winsock в чем проблема? - 2006-12-07 23:38:30.640000   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
А вот сервер на c:


#include <winsock.h>
#include <stdio.h>
#include <malloc.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define size_buf 32000
#define size_ans 20

using namespace std;
SOCKET server;
int send_answer(char *answer, int size)
{
    if(send(server, answer, size, 0) == SOCKET_ERROR) // SOCKET_ERROR = -1
    {
        VERIFY(SOCKET_ERROR != closesocket(server));
        WSACleanup();
    }
    return 0;
}

int recv_question(char *buf, int size)
{
    if(recv(server, buf, size, 0) == SOCKET_ERROR)
    {
        VERIFY(SOCKET_ERROR != closesocket(server));
        WSACleanup();
    }
    return 0;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    WORD VersionRequested;
    WSADATA ImplementationDetails;
    int Rlt;
    VersionRequested = MAKEWORD(1,1);
    Rlt=WSAStartup(VersionRequested,&ImplementationDetails);
    if (Rlt!=0) return 1;
    SOCKADDR_IN serverAddr;
    server = socket(AF_INET, SOCK_STREAM, 0);
    if(server == INVALID_SOCKET) return 1;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(32080);
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(server, (LPSOCKADDR)&serverAddr, sizeof(serverAddr));
    listen(server, 10);
    //——-opisanie————

    fd_set AllSockets, ReadS, WriteS, ExceptS;
    FD_ZERO(&AllSockets);
    FD_ZERO(&ReadS);
    FD_ZERO(&WriteS);
    FD_ZERO(&ExceptS);
    int NumberClient = 0;
    timeval *timeOut = new timeval();
    timeOut->tv_sec = 32000;
    SOCKADDR_IN ClientAddr;
    char *buf = (char *)malloc(size_buf);
    char *answer = (char *)malloc(size_ans);

    memcpy(answer, "OK", sizeof("OK"));
    if (select(1, &ReadS, &WriteS, &ExceptS, timeOut) == SOCKET_ERROR) return 1;  
    if (FD_ISSET(server, &ReadS))  //client chitaet s servera
    {  
        recv_question(buf, size_buf);
        printf("%s\n", buf);
        send_answer(answer, (int)strlen(answer));
        NumberClient = (int )accept(server, (LPSOCKADDR)&ClientAddr, NULL);
        if (NumberClient == INVALID_SOCKET) return 1;
        send_answer(answer, (int)strlen(answer));
        FD_SET(NumberClient, &AllSockets); //ystanavl v AllSockets
        FD_CLR(server, &ReadS);  //posle priem ydalaet iz ReadS
    }
    free(buf);
    free(answer);
    delete(timeOut);
}  

И обламывается он в строке if (select(1, &ReadS, &WriteS, &ExceptS, timeOut) == SOCKET_ERROR) return 1;
не пойму по чему, может кто знает?
Post #: 18
RE: winsock в чем проблема? - 2006-12-19 16:26:30.633333   
GorluM

Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00
Я ваще ниразбираюсь в этай теме, но я бы на тваем месте в сервере ни юзал бы селекта ваще, сделал бы создание патоков в цикле для каждого ассепта
Post #: 19
RE: winsock в чем проблема? - 2006-12-19 21:10:38.493333   
SantaS

Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
Я переписал код сервера, вот:
// winsock2_Serv.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "winsock2_Serv.h"
#include <winsock2.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define size_buf 400
#define size_ans 400
using namespace std;

typedef struct
{
    char *nikName;
    char *pass;
    char *ip_addr;
} inform, *user_base;

long WinsockStart();
SOCKET sock;
SOCKET sockConnected;
SOCKADDR_IN sockAddr;
user_base user_info;

int filter_login_pass(char *str, int length);
char *filter(char *str, int length);
int func_stream(); //obr_potoka
char *recvFunc(char *answer_buffer); //slyshaet port
int sendFunc(char *buffer); //otpravlaet clienty

int init_connect()
{
    long rc;
    sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); //ip addr
    sockAddr.sin_family = AF_INET; //protocol tcp
    sockAddr.sin_port = htons(32080); //port
    rc = WinsockStart(); //func start socket
    if(rc == SOCKET_ERROR)
    {
        cout << "Can't sartup socket failed!\n";
        return 1;
    }
    sock = socket(AF_INET, SOCK_STREAM, 0); //create socket
    if(sock == INVALID_SOCKET)
    {
        cout << "Can't create socket!\n";
        return 1;
    }
    rc = bind(sock, (const sockaddr*)&sockAddr, sizeof(sockAddr)); //open socket
    if(rc == SOCKET_ERROR)
    {
        cout << "Can't bind socket!\n";
        return 1;
    }
    rc = listen(sock, 10); //slyshat' soedinenia
    if(rc == SOCKET_ERROR)
    {
        cout << "can't listen!\n";
        return 1;
    }
    cout << "Waiting for connect…\n";
    return 0;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    user_info =(user_base)malloc(sizeof(inform));
    HANDLE hThread;
    DWORD idThread;
    SOCKADDR_IN clientAddr;
    int addrLength = sizeof(clientAddr);
    init_connect();
    while(1)
    {
        sockConnected = accept(sock, (sockaddr*)&clientAddr, &addrLength); //pronimat' soedinenia
        hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)func_stream, NULL, NULL, &idThread);    
    }
    free(user_info);
    closesocket(sock);
    closesocket(sockConnected);
    WSACleanup();
    return 0;
}

long WinsockStart()
{
    long rc;
    WORD version;
    WSADATA data;
    version = MAKEWORD(2, 10);
    rc = WSAStartup(version, &data);
    return rc;
}

int filter_login_pass(char *str, int length)
{
    char *pass = (char *)malloc(length);
    char *login =  (char *)malloc(20);
    int j = 0, k = 0;
    int i = 0, l = 0;
    int enter = 0;
    while(j != length)
    {
        if(str[j] == 0x2f) k++; //proverka na '/'
        if(k == 2) break;
        if(k == 0) memcpy(login + (i++), str + j, 1);
        if(k == 1)
        {
            if(enter == 0) memcpy(pass + (l++), str + (++j), 1);
            else memcpy(pass + (l++), str + j, 1);
            enter++;
        }
        j++;
    }
    memcpy(login + i, "\0", 1);
    memcpy(pass + l, "\0", 1);
    user_info->nikName = login;
    user_info->pass = pass;
    free(pass);
    free(login);
    return 0;
}

char *filter(char *str, int length)
{
    int len = 0;
    while(str[len] != 0x2f)
        len++;
    char *buf = (char *)malloc(len);
    for(int i = 0; i < len; i++)
    {
        if(str != 0x2f) //proverks na "/"
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(buf + i, str + i, 1);
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; memcpy(buf + i, "\0", 1);
&nbsp;&nbsp;&nbsp; free(buf);
&nbsp;&nbsp;&nbsp; return buf;
}

int func_stream()
{
&nbsp;&nbsp;&nbsp; char *buffer = (char *)malloc(size_buf);
&nbsp;&nbsp;&nbsp; char *answer_buffer = (char *)malloc(size_ans);
&nbsp;&nbsp;&nbsp; char *hh = (char *)malloc(40);
&nbsp;&nbsp;&nbsp; long rc = 0;
&nbsp;&nbsp;&nbsp; HANDLE sendThread;
&nbsp;&nbsp;&nbsp; DWORD sendThreadId;
&nbsp;&nbsp;&nbsp; HANDLE recvThread;
&nbsp;&nbsp;&nbsp; DWORD recvThreadId;
&nbsp;&nbsp;&nbsp; if(sockConnected == INVALID_SOCKET)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Can't accept connection - %d\n", WSAGetLastError());
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 1;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Ok connect\n");
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; recv(sockConnected, hh, 40, 0); //polychaem nik
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; filter_login_pass(hh, (int)strlen(hh));
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char ok[] = "OK/";
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; send(sockConnected, ok, (int)strlen(ok), 0);
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; sendThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)sendFunc, buffer, NULL, &amp;sendThreadId);
&nbsp;&nbsp;&nbsp; recvThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvFunc, answer_buffer, NULL, &amp;sendThreadId);
&nbsp;&nbsp;&nbsp; free(hh);
&nbsp;&nbsp;&nbsp; free(buffer);
&nbsp;&nbsp;&nbsp; free(answer_buffer);
&nbsp;&nbsp;&nbsp; return 0;
}

char *recvFunc(char *answer_buffer)
{
&nbsp;&nbsp;&nbsp; long rc = 0;
&nbsp;&nbsp;&nbsp; while(1)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rc = recv(sockConnected, answer_buffer, size_ans, 0);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(rc == SOCKET_ERROR) break;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; answer_buffer = filter(answer_buffer, size_ans);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%s&gt;%s\n", user_info-&gt;nikName, answer_buffer);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("root&gt;");
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; return answer_buffer;
}

int sendFunc(char *buffer)
{
&nbsp;&nbsp;&nbsp; long rc = 0;
&nbsp;&nbsp;&nbsp; while(1)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("root&gt;");
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scanf("%s", buffer);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(buffer[0] == 0x71) exit(1); //proverka na "q"
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int length = (int)strlen(buffer);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(buffer + length, "/", 1);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rc = send(sockConnected, buffer, length+1, 0);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(rc == SOCKET_ERROR)
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Can't send message to client");
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; return 0;
}
Post #: 20
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> winsock в чем проблема?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.