Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.221.204] |
|
Страницы: (3) 1 2 [3] все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
У Вас больше проблема с путями к заголовочным файлам. Потому и не компилится. А пример чистый С.
|
Сообщ.
#32
,
|
|
|
Да особой разницы то я и не вижу - с и спп
Добавлено Цитата dikdik @ А пример чистый С. Это точно.....поэтому я и не видел разницы Чистый С в Студии компилится как спп без проблем.....во всяком случае у меня. А по ошибкам - да, видимо нет доступа к описанию элементарных типов...... |
Сообщ.
#33
,
|
|
|
всё. поправил, теперь всё работает #include <stdio.h> /* for printf(), fprintf() */ #include <winsock2.h> /* for socket(),... */ #include <stdlib.h> /* for exit() */ #include <time.h> #include <sys/types.h> #define MAXDATASIZE 1000 #define RCVBUFSIZE 3200 /* Size of receive buffer */ void DieWithError(char *errorMessage){ perror(errorMessage); exit(0); }; /* Error handling function */ void main(int argc, char *argv[]) { int sock, rc; /* Socket descriptor */ struct sockaddr_in echoServAddr; /* Echo server address */ unsigned short echoServPort; /* Echo server port */ //char *servIP; /* Server IP address (dotted quad) */ char servIP[] = "10.0.2.2"; char echoString[]= "identifier=1z2y3z \r\n\r\n"; char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */ int echoStringLen; /* Length of string to echo */ int bytesRcvd, totalBytesRcvd; /* Bytes read in single recv() and total bytes read */ WSADATA wsaData; /* Structure for WinSock setup communication */ unsigned long nonblocking = 1; fd_set writefds, readfds, error_set; struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 500000; //servIP = argv[1]; /* First arg: server IP address (dotted quad) */ echoServPort = 8088; //atoi(8088); //atoi(argv[2]); /* Use given port, if any */ if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */ { fprintf(stderr, "WSAStartup() failed"); exit(1); } /* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) ) < 0) DieWithError("socket() failed"); /* Set the socket to nonblocking */ if (ioctlsocket(sock, FIONBIO, &nonblocking) != 0) DieWithError("ioctlsocket() failed"); /* Construct the server address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */ connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)); FD_ZERO(&writefds); FD_SET(sock, &writefds); rc = select(sock, NULL, &writefds, NULL, &tv); if((rc == 1) && (FD_ISSET(sock, &writefds))) { printf("connect success\n"); } else { printf("connect error\n"); return; } send(sock, "identifier=1z2y3z \r\n\r\n", 26, 0);// шлем id for ( ; ; ) { FD_ZERO(&readfds); FD_ZERO(&error_set); FD_SET(sock, &readfds); FD_SET(sock, &error_set); // if ( select( sock, &readfds, NULL, &error_set, &tv ) == 1 ) { // check for error if ( FD_ISSET( sock, &error_set ) ) { int error, error_len = sizeof( error ); getsockopt( sock, SOL_SOCKET, SO_ERROR, (char*) &error, &error_len ); fprintf( stderr, "\nError on socket (error: %d)\n", error ); } // check for message if ( FD_ISSET( sock, &readfds ) ) { // receive some data from server if ( ( bytesRcvd = recv( sock, echoBuffer, MAXDATASIZE, 0 ) ) == SOCKET_ERROR ) { fprintf( stderr, "Failed receiving data\n" ); } else { echoBuffer[bytesRcvd] = '\0'; // display the message printf( "\nYep! I got a message: %s\n", echoBuffer ); } } break; } printf( "." ); } WSACleanup(); // Cleanup Winsock } Добавлено Цитата Oleg2004 @ Да особой разницы то я и не вижу - с и спп Добавлено Цитата dikdik @ А пример чистый С. Это точно.....поэтому я и не видел разницы Чистый С в Студии компилится как спп без проблем.....во всяком случае у меня. А по ошибкам - да, видимо нет доступа к описанию элементарных типов...... Добавлено Цитата dikdik @ У Вас больше проблема с путями к заголовочным файлам. Потому и не компилится. А пример чистый С. так я тоже думал что оно Си'шное. *.c не компилится, а с *.cpp компилится. Всё таки проблема с путями/доступом_к_описанию_элементарных_типов или то написано на C++? |
Сообщ.
#34
,
|
|
|
странно. У меня собирается как под расширением си, так и под расширением сипипи. Как под борландом, так и под майкрософтом.
И приведенный код работает. Как это не странно. Я опять коннекчусь на яндекс, отправляю эту дребездень которая идентифаер стринг, и получаю 400й код. Из неправильного - перед каждым селектом надо делать FD_SET. Нужно обнулять массивы директивой FD_ZERO либо в конце основного цикла, либо в начале.. короче, всю эту требуху Цитата FD_ZERO(&readfds); FD_ZERO(&error_set); FD_SET(sock, &readfds); FD_SET(sock, &error_set); нужно в основной цикл, сразу за фореву |
Сообщ.
#35
,
|
|
|
Цитата nemez @ странно. У меня собирается как под расширением си, так и под расширением сипипи. Как под борландом, так и под майкрософтом. И приведенный код работает. Как это не странно. Я опять коннекчусь на яндекс, отправляю эту дребездень которая идентифаер стринг, и получаю 400й код. Из неправильного - перед каждым селектом надо делать FD_SET. Нужно обнулять массивы директивой FD_ZERO либо в конце основного цикла, либо в начале.. короче, всю эту требуху Цитата FD_ZERO(&readfds); FD_ZERO(&error_set); FD_SET(sock, &readfds); FD_SET(sock, &error_set); нужно в основной цикл, сразу за фореву сбросы и сеты поправил. на яндексе код заработал. и на серве вроде тоже заработал. |
Сообщ.
#36
,
|
|
|
Цитата nemez @ нужно в основной цикл, сразу за фореву Я как раз об этом предупреждал Это известная фишка селекта - после единственного срабатывания - все маски событий сбрасываются - и их надо восстанавливать снова..... Поэтому тут и пишется for ( ; ; ) { FD_ZERO(&readfds); FD_ZERO(&error_set); FD_SET(sock, &readfds); FD_SET(sock, &error_set); ............. Ну а насчет как работает.... Так этот код не был заточен под HTTP - естественно надо видоизменять...... Теперь ваша задача - прочувствовать код......это сетевое программирование - а не хухры мухры.... |
Сообщ.
#37
,
|
|
|
а еще вопрос.
принял я эти данные, хочу продолжать принимать дальше. комментирую break программа сначала ждет принятия данных, каждые &tv печатает по точке, потом когда данные отосланы, принимает их, распечатывает, возвращается к select, он ей что то говорит и она пропускает чтение - начинает просто бесконечно из-за for (;;) ставить точки без всяких таймаутов. а что нужно сделать чтобы опять ждала принятия данных? |
Сообщ.
#38
,
|
|
|
селект возвращает единицу если он успешно отработал. Если селект вылетел по таймауту - он возвращает ноль. Если случилась ошибка - он возвращает отрицательный результат.
Точка у тебя печатается не по таймауту, а по любому из трех событий - прием данных, ошибка, таймаут. Это первое. Чтобы оно не ставило точки - закоментируй принтф. Чтобы оно не вылетало по таймауту - передай в селект в качестве последнего аргумента ноль. |
Сообщ.
#39
,
|
|
|
эмм, еще вопрос - моя готовая программка на локальном компе открывает порт, всё время разный. как можно указать собственный?
вот скрин http://imm.io/4nO |
Сообщ.
#40
,
|
|
|
bind?
|