winsock в чем проблема?
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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.
|
|
|
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
|
|
|
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 он и есть
|
|
|
RE: winsock в чем проблема? - 2006-12-04 20:14:47.873333
|
|
|
G@rd
Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
|
Так я не понял, у вас функция send данные отсылает или возвращает -1
|
|
|
RE: winsock в чем проблема? - 2006-12-04 20:24:05.906666
|
|
|
SantaS
Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
|
Пакеты до сервера не доходят, я попробовал WSAGetLastError функция вернула 10057 сложно сказать отсылает или нет.
|
|
|
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 в поле хоста вставить.
|
|
|
RE: winsock в чем проблема? - 2006-12-04 21:05:00.500000
|
|
|
SantaS
Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
|
мля, и так не получается! с той же ошибкой.
|
|
|
RE: winsock в чем проблема? - 2006-12-04 21:22:12.250000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
а ты попробуй посмотреть что connect возвращает. если сокет нот коннектед, то вероятно эксепшн именно в connect случается, и именно его надо трактовать, а не последующие нот коннектед.
|
|
|
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 не написал, может из-за этого.
|
|
|
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 <sys/types.h>
#include <sys/socket.h>
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.
|
|
|
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); прога уже отправляет пакеты на сервер, но когда дохолит до приема данных, там останавливается, сервер должен после приняти пакета вывести на экран и отправить ответ. Когда я ломаю соединение клиента, сервер выводит посланное сообщение и отваливается.
|
|
|
RE: winsock в чем проблема? - 2006-12-05 20:50:40.670000
|
|
|
G@rd
Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
|
Если я правильно понял, необходимо чтобы клиент не ждал приёма пакета а работал дальше, тогда необходимо перевести сокет в неблокирующий режим. Если вопрос почему сервер отваливается, то мы кода его не знаем, так как не телепаты.
|
|
|
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;
|
|
|
RE: winsock в чем проблема? - 2006-12-06 18:17:43.970000
|
|
|
G@rd
Сообщений: 74
Оценки: 0
Присоединился: 2004-11-13 17:11:57
|
К сожалению перл я не знаю( Я не понял перл сервер выводит команду на экран или нет? Хорошо было бы посмотреть данные общения в сети(по показаниям снифера) между клиентом на С и сервером, и клиентом на Перл с сервером.
|
|
|
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 принял. Пакеты идут.
|
|
|
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 прокси сервера, которе показывают какие данные прошли по каналу и сообщения о соединении разрыве и т. д.
|
|
|
RE: winsock в чем проблема? - 2006-12-07 19:13:24.046666
|
|
|
SantaS
Сообщений: 99
Оценки: 0
Присоединился: 2006-09-23 21:49:06.040000
|
Был где то XSpider, попробую…
|
|
|
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; не пойму по чему, может кто знает?
|
|
|
RE: winsock в чем проблема? - 2006-12-19 16:26:30.633333
|
|
|
GorluM
Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00
|
Я ваще ниразбираюсь в этай теме, но я бы на тваем месте в сервере ни юзал бы селекта ваще, сделал бы создание патоков в цикле для каждого ассепта
|
|
|
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 "/" memcpy(buf + i, str + i, 1); } memcpy(buf + i, "\0", 1); free(buf); return buf; } int func_stream() { char *buffer = (char *)malloc(size_buf); char *answer_buffer = (char *)malloc(size_ans); char *hh = (char *)malloc(40); long rc = 0; HANDLE sendThread; DWORD sendThreadId; HANDLE recvThread; DWORD recvThreadId; if(sockConnected == INVALID_SOCKET) { printf("Can't accept connection - %d\n", WSAGetLastError()); return 1; } else { printf("Ok connect\n"); recv(sockConnected, hh, 40, 0); //polychaem nik filter_login_pass(hh, (int)strlen(hh)); char ok[] = "OK/"; send(sockConnected, ok, (int)strlen(ok), 0); } sendThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)sendFunc, buffer, NULL, &sendThreadId); recvThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvFunc, answer_buffer, NULL, &sendThreadId); free(hh); free(buffer); free(answer_buffer); return 0; } char *recvFunc(char *answer_buffer) { long rc = 0; while(1) { rc = recv(sockConnected, answer_buffer, size_ans, 0); if(rc == SOCKET_ERROR) break; answer_buffer = filter(answer_buffer, size_ans); printf("%s>%s\n", user_info->nikName, answer_buffer); printf("root>"); } return answer_buffer; } int sendFunc(char *buffer) { long rc = 0; while(1) { printf("root>"); scanf("%s", buffer); if(buffer[0] == 0x71) exit(1); //proverka na "q" int length = (int)strlen(buffer); memcpy(buffer + length, "/", 1); rc = send(sockConnected, buffer, length+1, 0); if(rc == SOCKET_ERROR) { printf("Can't send message to client"); break; } } return 0; }
|
|
|
|
|