Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Простой Socket Server


Автор: OutlawZ 28.11.2011, 00:21
Привет всем, только начал познавать сокеты в С++, и столкнулся с проблемой, помогите найти ошибку в коде что тут может быть не правильным?
Дело в том что все компилится и запускается, сервер висит на порту, но когда я посылаю команду скажем через телнет telnet 127.0.0.1 7766 sen m
сервер нечего не выводит. вот код:
Код

#include <winsock.h>
#include <windows.h>

#pragma comment(lib, "libws2_32")
#pragma comment(linker,"MERGE:.rdata=.text")
#pragma comment(linker,"FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"ENTRY:WinMain")

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
 char buff[4] = "root";
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2,2),&wsaData);
 SOCKET sock = socket(AF_INET, SOCK_STREAM,0);
 
 struct sockaddr_in addr;
 addr.sin_family      = AF_INET;
 addr.sin_port        = htons(7766);
 addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
 bind(sock,(SOCKADDR*)&addr,sizeof(addr));
 listen(sock,1);
 
 SOCKET cSock = accept(sock,0,0);
 
 char type[2];
 while(true)
 {
  recv(cSock,type,2,0);
   if (type[0] == 'm') {
    cout << "Message" << "\n";
   }
  shutdown(cSock,1);
  closesocket(cSock);
 }
}

Задача такая если пришло m, то вывести Message, но мессагу не выводит.

Код

if (type[0] == 'c')
{
 send(cSock,buff,4,0);
}

И клиенту нечего не отправляет, т.е получили "c" отравить "root" клиенту.  Помогите найти в где ошибка. Использую Dev-C++ 4.9

Автор: fish9370 28.11.2011, 10:13
делаешь, ты все впрниципе правильно, но у меня есть сомнения в правильности использования

Код

telnet 127.0.0.1 7766 sen m


- вот это что?

для решения твоей задачки, я бы посоветовал сделать дебаговое сообщение того что пришло на вход..

пара советов:

- используй sizeof() для вычисления размера буфера
- проверяй на ошибки (socket, accept, recv, send)

и напиши своего собственного клиента, чтобы тестить было удобнее


Автор: feodorv 28.11.2011, 17:00
У меня всё отправилось:

Код
#include <winsock.h>
#pragma comment(lib, "ws2_32")
#pragma comment(linker,"MERGE:.rdata=.text")
#pragma comment(linker,"FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"ENTRY:WinMain")
int main()
{
 char *buff = "root";
 WSADATA wsaData;
 SOCKET sock;
 struct sockaddr_in addr;

 WSAStartup(MAKEWORD(2,2),&wsaData);
 sock = socket(AF_INET, SOCK_STREAM,0);
 addr.sin_family      = AF_INET;
 addr.sin_port        = htons(7766);
 addr.sin_addr.s_addr = htonl(INADDR_ANY);

 bind(sock,(SOCKADDR*)&addr,sizeof(addr));
 listen(sock,1);

 while(1)
 {
   char type[2];
   SOCKET cSock = accept(sock,0,0);
   recv(cSock,type,2,0);
   if (type[0] == 'm')
   {
     printf( "Message\n" );
     send(cSock,buff,4,0);
     shutdown(cSock,1);
     closesocket(cSock);
   }
 }
}


Ну и, как уже говорилось, остро нужен контроль ошибок...

Автор: OutlawZ 29.11.2011, 11:59
Спасибо всем за участие. 
feodorv а вы какой компилятор используете? а то я на gcc сижу.

Автор: feodorv 1.12.2011, 02:55
Цитата(OutlawZ @  29.11.2011,  11:59 Найти цитируемый пост)
feodorv а вы какой компилятор используете? а то я на gcc сижу.

MS Visual C++ smile 
Ну это не страшно, отличия в коде минимальны)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)