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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2010, 00:31   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию клиент не получает сообщение(winsock)

не могу понять почему клиент не получает сообщение от сервера
выделил для удобства
VC++ 2008
Код:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")

#define OK 0
#define FAIL 1
#define CONNECT_LOST1 2
#define CONNECT_LOST2 3
#define MSG_EMPTY 4

#define MAX_LEN 1024

#define PORT 110
#define _HOST "pop3.mail.ru"



using namespace std;

int SEND(SOCKET, string);
int RECV(SOCKET, char*);

int _tmain(int argc, _TCHAR* argv[])
{
   int ans;
   char GET_MSG[ MAX_LEN ];
   WSAData WSData;
   WSAStartup(0x101,&WSData);
   SOCKET S = socket(AF_INET,SOCK_STREAM,0);
   sockaddr_in SA;
   SA.sin_family=AF_INET;
   SA.sin_port=htons(PORT);
   SA.sin_addr.S_un.S_addr=inet_addr(_HOST);
   connect(S,(sockaddr*)&SA,sizeof(SA));
   bind(S,(sockaddr*)&SA,sizeof(SA));
   listen(S, SOMAXCONN);

   ans = SEND(S, "user xxxxxx@bk.ru");
   switch(ans){
		case FAIL: cout << "Server connection failed\n"; break;
		case MSG_EMPTY: cout << "Message is empty\n"; break;
                case CONNECT_LOST1: cout << "Server get empty message...\n"; break;
		case CONNECT_LOST2: cout << "Server connection lost...\n"; break;	    
		case OK: cout << "Message sending successfully\n"; break;
   }
// на счет этого я не уверен
   SOCKET NS = accept(S, 0,0);     // accept мне возвращает INVALID_SOCKET
   
// получение сообщения
   ans = RECV(NS, GET_MSG);
   
   switch(ans){
		case FAIL: cout << "Server connection failed\n"; break;
		case MSG_EMPTY: cout << "Message is empty\n"; break;
		case CONNECT_LOST1: cout << "Server send empty message...\n"; break;
		case CONNECT_LOST2: cout << "Server connection lost...\n"; break;
		case OK: cout << "Message get successfully\n"; break;
   } 
   
   closesocket(NS); 
   closesocket(S);
   WSACleanup();
   cin.get();
	return 0;
}

int SEND(SOCKET S,string msg) {
        if(S == NULL) return FAIL;
        if(msg.length() == 0) return MSG_EMPTY;
        int is_send; 
        char len_msg = msg.length();
        if( (is_send = send(S, &len_msg, 1, 0)) <= 0)
                return CONNECT_LOST1;
        if( (is_send = send(S, msg.c_str(), msg.length(),0)) <= 0)
                return CONNECT_LOST2;
  return OK;
}


int RECV(SOCKET S, char msg[1024]) {
        if(S == NULL) return FAIL;
        int is_recv;
        char len_msg = 0;
        // получаем длину сообщения( возвращает -1 - ошибка )
         if( (is_recv = recv(S, &len_msg, 1, 0)) <= 0)
                return CONNECT_LOST1;
        if(len_msg == 0) return MSG_EMPTY;
        if( (is_recv = recv(S, msg, len_msg, 0)) <= 0)	 
                return CONNECT_LOST2;
    return OK;
}

Последний раз редактировалось NiCola999; 20.07.2010 в 00:45.
NiCola999 вне форума Ответить с цитированием
Старый 20.07.2010, 08:42   #2
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

WsaGetLastError() чем ругается?
http://msdn.microsoft.com/en-us/libr...80(VS.85).aspx
ей же можно посмотреть почему не принимается сокет.

Последний раз редактировалось Teksa; 20.07.2010 в 08:44.
Teksa вне форума Ответить с цитированием
Старый 20.07.2010, 10:18   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а проблема была в том что он не понимает имя хоста оО, только IP... а как можно сделать чтобы имя можно было написать и подсоединиться?

Последний раз редактировалось NiCola999; 20.07.2010 в 11:14.
NiCola999 вне форума Ответить с цитированием
Старый 20.07.2010, 21:57   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

не могу понять в чем проблема, после второй команды функция recvfrom (в ф-ии RECV) виснет....

Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")


#define OK 0
#define FAIL 1
#define CONNECT_LOST1 2
#define CONNECT_LOST2 3
#define MSG_EMPTY 4
#define SOCKET_FAIL 5

#define MAX_LEN 100

#define PORT 110
#define _HOST "94.100.177.6"

using namespace std;

int SEND(SOCKET, char*);
int RECV(SOCKET, char*);

int _tmain(int argc, _TCHAR* argv[])
{
   setlocale(LC_ALL, "Russian");
   int ans = -5;      
   WSAData WSData;
   WSAStartup(0x101,&WSData);
   SOCKET S = socket(AF_INET,SOCK_STREAM,0);
   sockaddr_in SA;
   SA.sin_family=AF_INET;
   SA.sin_port=htons(110);      
   SA.sin_addr.S_un.S_addr=inet_addr(_HOST);
   connect(S,(sockaddr*)&SA,sizeof(SA));   
   
   char* commands[3] = {"user xxxxx@bk.ru", "pass xxxxxxxxx", "state"};
   int index = 0;
   char GET_MSG[100];
   char SEND_MSG[100];     
while(index < 3){	            
   ans = SEND(S, commands[index++]);    
   switch(ans){
		case FAIL: cout << "Server connection failed\n"; break;             
		case MSG_EMPTY: cout << "Message is empty\n"; break;	    
	    case CONNECT_LOST1: cout << "Server get empty message...\n"; break;
		case CONNECT_LOST2: cout << "Server connection lost...\n"; break;		
   } 
   
   ans = RECV(S, GET_MSG);     
   switch(ans){
		case FAIL: cout << "Server connection failed\n"; break;		
		case MSG_EMPTY: cout << "Message is empty\n"; break;
		case CONNECT_LOST1: cout << "Server send empty message...\n"; break;
		case CONNECT_LOST2: cout << "Server connection lost...\n"; break;

		case OK: 
		   printf("Server: ");
           printf(GET_MSG);
		   printf("\n");
		break;
   }   
}   

   closesocket(S);
   WSACleanup();   
   cin.get();
   return 0;
}


int SEND(SOCKET S,char* msg) {
 if(S == INVALID_SOCKET) return SOCKET_FAIL;
 if(S == NULL) return FAIL;
 if(strlen(msg) == 0) return MSG_EMPTY;
 int is_send; 
 if( (is_send = send(S, msg, sizeof(msg),MSG_DONTROUTE)) < 0)
	 return CONNECT_LOST2;
 return OK;
}

int RECV(SOCKET S, char* msg) {
 if(S == INVALID_SOCKET) return SOCKET_FAIL;
 if(S == NULL) return FAIL; 
 int read_bytes = 0;
 if( (read_bytes = recvfrom(S, msg, sizeof(msg), 0, NULL, NULL)) < 0)	 
	 return CONNECT_LOST2;  
 if(read_bytes == 0) return MSG_EMPTY; 
 msg[ read_bytes ] = '\0'; 
	return OK;
}

Последний раз редактировалось NiCola999; 20.07.2010 в 23:05.
NiCola999 вне форума Ответить с цитированием
Старый 21.07.2010, 12:08   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

проблема решена. Но мне интересно, а как принять сообщение, если оно состоит из нескольких строк? Можно пример?

Последний раз редактировалось NiCola999; 21.07.2010 в 14:51.
NiCola999 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idhttp.get() не получает исходник страницы mistrmax Работа с сетью в Delphi 2 30.05.2010 17:26
Клиент-Сервер на WinSock Вишенка Работа с сетью в Delphi 3 24.02.2010 00:45
HTTP Не получает ответ AngelOfDeath Работа с сетью в Delphi 3 23.08.2009 13:06
ftp клиент на winsock sergoss Работа с сетью в Delphi 1 07.05.2009 19:07