Сокеты в VC++ 2008 - C (СИ)
Формулировка задачи:
Привет всем.
Я делаю клиент и сервер.
Делаю по книге : Снейдер Й. - Эффективное программирование TCP-IP.
Там есть типа заготовки на клиента и сервер. Вот я по заготовке и делаю...
Возникли проблемы уже на начале, при том пишет что ошибки в подключаемых стандартных файлах : winsock2.h и ws2def.h.
Вот такой код у меня:
Вот такие ошибки пишет(там в комментариях в некоторых местах указываю на какую строку ругается):
Ошибка 5 error C2143: синтаксическая ошибка: отсутствие "}" перед "константа" c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 384
Ошибка 4 error C2011: sockaddr: переопределение типа "struct" c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 206
А вот здесь вроде как и справедливая ошибка:
Ошибка 8 error C2143: синтаксическая ошибка: отсутствие ";" перед "}" c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 437
Ошибка 9 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 437
Ошибка 64 error C2375: WSAStartup: переопределение; другая компоновка c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h 2145
Ну вобщем вот такие ошибки и их всего 69.
Кстати, в VC++ в Проект/Свойства/Компоновщик/Общие/Дополнительные каталоги библиотек я поставил wsock32.lib , а также это я поставил wsock32.dll в Проект/Свойства/Компоновщик/Ввод/Добавить модуль в сборку (пробовал сюда ставить wsock32.lib вместо wsock32.dll , а также пробовал и то и другое ставить).
Подскажите, пожалуйста, что может быть не так. Просто я полный ноль в этом деле, уже 2 дня морочусь и никак не могу понять что до чего.
Может у кого-то есть примеры сервера и клиента для Виндовс, то буду признателен если пришлете, так на примере будет легче понять.
Заранее благодарю за внимание.
#include "stdafx.h" #include <windows.h> #include "winsock2.h" #include <stdio.h> #include <stdlib.h> //#include <unistd.h> #include <stdarg.h> #include <string.h> #include <errno.h> #include <netdb.h> #include <fcntl.h> #include <time.h> #include <socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "skel.h" char *program_name; int main( int argc, char **argv ) { struct sockaddr_in local; struct sockaddr_in peer; }
// Protocols. The IPv6 defines are specified in RFC 2292. // typedef enum { #if(_WIN32_WINNT >= 0x0501) IPPROTO_HOPOPTS = 0, // IPv6 Hop-by-Hop options #endif//(_WIN32_WINNT >= 0x0501) IPPROTO_ICMP = 1, // вот здесь на ошибку показывает IPPROTO_IGMP = 2, IPPROTO_GGP = 3, #if(_WIN32_WINNT >= 0x0501) IPPROTO_IPV4 = 4, #endif//(_WIN32_WINNT >= 0x0501) // это далеко не полный текст этого файла. могу полный показать. как видно выше, это из include\ws2def.h
typedef struct sockaddr { #if (_WIN32_WINNT < 0x0600) u_short sa_family; #else ADDRESS_FAMILY sa_family; // Address family. #endif //(_WIN32_WINNT < 0x0600) CHAR sa_data[14]; // Up to 14 bytes of direct address. } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
// // These are reserved for internal use by Windows. // IPPROTO_RESERVED_RAW = 257, IPPROTO_RESERVED_IPSEC = 258, IPPROTO_RESERVED_IPSECOFFLOAD = 259, IPPROTO_RESERVED_MAX = 260 // должна же тут быть ";" у меня что с ошибками файлы эти? } IPPROTO, *PIPROTO;
// // These are reserved for internal use by Windows. // IPPROTO_RESERVED_RAW = 257, IPPROTO_RESERVED_IPSEC = 258, IPPROTO_RESERVED_IPSECOFFLOAD = 259, IPPROTO_RESERVED_MAX = 260 } IPPROTO, *PIPROTO; // вот на этой строке показывает error
/* Microsoft Windows Extension function prototypes */ #if INCL_WINSOCK_API_PROTOTYPES __control_entrypoint(DllExport) WINSOCK_API_LINKAGE int WSAAPI WSAStartup( IN WORD wVersionRequested, OUT LPWSADATA lpWSAData ); #endif /* INCL_WINSOCK_API_PROTOTYPES */ #if INCL_WINSOCK_API_TYPEDEFS typedef int (WSAAPI * LPFN_WSASTARTUP)( IN WORD wVersionRequested, OUT LPWSADATA lpWSAData );// вот здесь на эту ошибку показывает #endif /* INCL_WINSOCK_API_TYPEDEFS */
Решение задачи: «Сокеты в VC++ 2008»
textual
Листинг программы
//#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> //#include <unistd.h> #include <stdarg.h> #include <string.h> #include <errno.h> //#include <netdb.h> //#include <socket.h> #include <fcntl.h> #include <time.h> // //#include <netinet/in.h> //#include <arpa/inet.h> /*âåðñèÿ äëÿ WINDOWS */ #define INIT() ( program_name = \ strrchr ( argv[ 0 ], '/' ) ) ? \ program_name++ : \ ( program_name = argv[ 0 ] ) #define EXIT(s) exit(s) #define CLOSE(s) if (closesocket(s)) error( 1, errno, "îøèáêГ* âûçîâГ* close") #define set_errno(e) SetLastError(e) #define isvalidsock(s) ( ( s ) != SOCKET_ERROR ) #define bzero(b,n) memset(b,0,n) #define sleep(t) Sleep( ( t ) * 1000 ) char *program_name = 0; void error( int status, int err, char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf (stderr, "%s: ", program_name ); vfprintf( stderr, fmt, ap ) ; va_end( ap ) ; if ( err ) fprintf( stderr, ": %s (%d)\n", strerror( err ), err); if ( status ) EXIT(status); } int inet_aton( char *cp, struct in_addr *pin ) { int re; re = inet_addr( cp ); if ( re == -1 && strcmp (cp, "255.255.255.255" ) ) return 0; pin->s_addr = re; return 1; } static void set_address(char *hname, char *sname, struct sockaddr_in *sap, char *protocol) { struct servent *sp; struct hostent *hp; char *endptr; short port; bzero (sap, sizeof(*sap)); sap->sin_family = AF_INET; if (hname != NULL) { if (!inet_aton (hname, &sap->sin_addr)) { hp = gethostbyname(hname); if ( hp == NULL ) error( 1, 0, "Г*åèçâåñòГ*ûé õîñò: %s\n", hname ); sap->sin_addr = *( struct in_addr * )hp->h_addr; } } else sap->sin_addr.s_addr = htonl( INADDR_ANY ); port = strtol( sname, &endptr, 0 ); if ( *endptr == '\0' ) sap->sin_port = htons( port ); else { sp = getservbyname( sname, protocol ); if ( sp == NULL ) error( 1, 0, "Г*åèçâåñòГ*ûé ñåðâèñ: %s\n", sname ); sap->sin_port = sp->s_port; } } static void server(SOCKET s, struct sockaddr_in *peerp) { send( s, "hello, world\n", 13, 0); } void main( int argc, char **argv ) { struct sockaddr_in local; struct sockaddr_in peer; char *hname; char *sname; int peerlen; SOCKET s1; SOCKET s; const char on = 1; INIT (); if ( argc == 2 ) { hname = NULL; sname = argv[ 1 ]; } else { hname = argv[ 1 ]; sname = argv[ 2 ]; } set_address( hname, sname, &local, "tcp" ); s = socket( AF_INET, SOCK_STREAM, 0 ); if ( !isvalidsock( s ) ) error ( 1, errno, "îøèáêГ* âûçîâГ* socket" ); if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof( on ) ) ) error( 1, errno, "îøèáêГ* âûçîâГ* setsockopt" ); if ( bind( s, ( struct sockaddr * ) &local, sizeof( local ) ) ) error( 1, errno, "îøèáêГ* âûçîâГ* bind" ); if ( listen ( s, SO_ACCEPTCONN ) ) error( 1, errno, "îøèáêГ* âûçîâГ* listen" ); do { peerlen = sizeof( peer ); s1 = accept( s, ( struct sockaddr * )&peer, &peerlen ); if ( !isvalidsock( s1 ) ) error( 1, errno, "îøèáêГ* âûçîâГ* accept" ); server( s1, &peer ); CLOSE( s1 ); } while ( 1 ); EXIT( 0 ); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д