
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.198] |
![]() |
|
Сообщ.
#1
,
|
|
|
При попытке компиляции Borland ругается на
#include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> и соответственно на функции socket(AF_INET, SOCK_STREAM, 0) и т.д. Вопрос, где можно взять эти библиотеки и как их подключить. (Если нужно для этого инсталлировать компонент, то какой?) Возможно такой вопрос уже поднимался, но ответ найти не удалось. |
![]() |
Сообщ.
#2
,
|
|
Портировать никсовые исходники в виндовс уметь надо.
include'ы удалить и добавить #include <winsock2.h>. Правда не факт, что не возникнет еще тучи ошибок... ![]() |
Сообщ.
#3
,
|
|
|
Теперь ругается на строку
![]() ![]() setsockopt(s0, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)); [C++ Error] server.cpp(50): E2034 Cannot convert 'linger *' to 'const char *' [C++ Error] server.cpp(50): E2342 Type mismatch in parameter 'optval' (wanted 'const char *', got 'linger *') [C++ Error] server.cpp(61): E2451 Undefined symbol 'socklen_t' [C++ Error] server.cpp(61): E2379 Statement missing ; [C++ Error] server.cpp(62): E2451 Undefined symbol 'peeraddr_len' [C++ Warning] server.cpp(93): W8004 'linger_opt' is assigned a value that is never used Подскажите, как исправить? Код всей программы (в инете нашла) ![]() ![]() // // A simple Internet server application. // It listens to the port written in command line (default 1234), // accepts a connection, and sends the "Hello!\r\n" message // to a client. Then it receives the answer from a client and terminates. // // Usage: // server [port_to_listen] // Default is the port 1234. // #include <stdio.h> #include <string.h> #include <stdlib.h> #include <io.h> #include <winsock2.h> static void usage(); int main(int argc, char *argv[]) { if (argc > 1 && *(argv[1]) == '-') { usage(); exit(1); } int listenPort = 1234; if (argc > 1) listenPort = atoi(argv[1]); // Create a socket int s0 = socket(AF_INET, SOCK_STREAM, 0); if (s0 < 0) { perror("Cannot create a socket"); exit(1); } // Fill in the address structure containing self address struct sockaddr_in myaddr; memset(&myaddr, 0, sizeof(struct sockaddr_in)); myaddr.sin_family = AF_INET; myaddr.sin_port = htons(listenPort); // Port to listen myaddr.sin_addr.s_addr = htonl(INADDR_ANY); // Bind a socket to the address int res = bind(s0, (struct sockaddr*) &myaddr, sizeof(myaddr)); if (res < 0) { perror("Cannot bind a socket"); exit(1); } // Set the "LINGER" timeout to zero, to close the listen socket // immediately at program termination. struct linger linger_opt = { 1, 0 }; // Linger active, timeout 0 setsockopt(s0, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)); // Now, listen for a connection res = listen(s0, 1); // "1" is the maximal length of the queue if (res < 0) { perror("Cannot listen"); exit(1); } // Accept a connection (the "accept" command waits for a connection with // no timeout limit...) struct sockaddr_in peeraddr; socklen_t peeraddr_len; int s1 = accept(s0, (struct sockaddr*) &peeraddr, &peeraddr_len); if (s1 < 0) { perror("Cannot accept"); exit(1); } // A connection is accepted. The new socket "s1" is created // for data input/output. The peeraddr structure is filled in with // the address of connected entity, print it. printf( "Connection from IP %d.%d.%d.%d, port %d\n", (ntohl(peeraddr.sin_addr.s_addr) >> 24) & 0xff, // High byte of address (ntohl(peeraddr.sin_addr.s_addr) >> 16) & 0xff, // . . . (ntohl(peeraddr.sin_addr.s_addr) >> 8) & 0xff, // . . . ntohl(peeraddr.sin_addr.s_addr) & 0xff, // Low byte of addr ntohs(peeraddr.sin_port) ); res = close(s0); // Close the listen socket write(s1, "Hello!\r\n", 8); char buffer[1024]; res = read(s1, buffer, 1023); if (res < 0) { perror("Read error"); exit(1); } buffer[res] = 0; printf("Received %d bytes:\n%s", res, buffer); close(s1); // Close the data socket return 0; } static void usage() { printf( "A simple Internet server application.\n" "It listens to the port written in command line (default 1234),\n" "accepts a connection, and sends the \"Hello!\" message to a client.\n" "Then it receives the answer from a client and terminates.\n\n" "Usage:\n" " server [port_to_listen]\n" "Default is the port 1234.\n" ); } Добавлено Если заменить socklen_t на int (как я поняла они должны быть равны), то отсаются только ошибки: [C++ Error] server.cpp(50): E2034 Cannot convert 'linger *' to 'const char *' [C++ Error] server.cpp(50): E2342 Type mismatch in parameter 'optval' (wanted 'const char *', got 'linger *') к строке ![]() ![]() setsockopt(s0, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)); Что с этим можно сделать? Добавлено Заработало! Вот как далжно это выглядить. setsockopt(s0, SOL_SOCKET, SO_LINGER, (char *) &linger_opt, sizeof(linger_opt)); |
Сообщ.
#4
,
|
|
|
Во первых по большому счету для простой программы сервера лингер не нужен - так что просто закомментируйте эти строки
Во вторых, поставьте здесь res = listen(s0, 1) бэклог 5: res = listen(s0, 5) Ну и прототип для Виндовс такой: int setsockopt( SOCKET s, int level, int optname, const char FAR* optval, int optlen); Попробуйте так: Err = setsockopt(s0, SOL_SOCKET, SO_LINGER, (char *)&OptVal, sizeof(OptVal)); |
Сообщ.
#5
,
|
|
|
Но Выдает ошибку Cannot create a socket: 0
![]() ![]() // Create a socket int s0 = socket(AF_INET, SOCK_STREAM, 0); if (s0 < 0) { perror("Cannot create a socket"); getchar(); exit(1); } Добавлено С чем это может быть связанно? Идей нет совсем... ![]() |
Сообщ.
#6
,
|
|
|
Сокет в виндах не int - a SOCKET s
Добавлено Цитата Fluffy Pearl @ Но Выдает ошибку Cannot create a socket: 0 Cтранно - вы ведь только что написали, что заработало? ![]() |
Сообщ.
#7
,
|
|
|
Воспользовалась таким советом и заработало:
Цитата Прежде чем воспользоваться функцией socket необходимо проинициализировать процесс библиотеки wsock32.dll вызвав функцию WSAStartup например: WSADATA WsaData; int err = WSAStartup (0x0101, &WsaData); if (err == SOCKET_ERROR) { printf ("WSAStartup() failed: %ld\n", GetLastError ()); return 1; } Здесь 0х0101 версия библиотеки которую следует использовать. ![]() Oleg2004 Заработало - в смысле перестало выдавать ошибки на этапе коипиляции. |
Сообщ.
#8
,
|
|
|
Цитата Fluffy Pearl @ Прежде чем воспользоваться функцией socket необходимо проинициализировать процесс библиотеки wsock32.dll вызвав функцию WSAStartup например: А вы это не сделали?????? Ну что ж, теперь будете знать ![]() Еще в конце при выходе надо сделать WSACleanup() ![]() |
Сообщ.
#9
,
|
|
|
Спасибо
![]() До этого я видимо не дошла. ![]() |