Сокеты в VC++ 2008 - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет всем. Я делаю клиент и сервер. Делаю по книге : Снейдер Й. - Эффективное программирование TCP-IP. Там есть типа заготовки на клиента и сервер. Вот я по заготовке и делаю... Возникли проблемы уже на начале, при том пишет что ошибки в подключаемых стандартных файлах : winsock2.h и ws2def.h. Вот такой код у меня:
#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;
}
Вот такие ошибки пишет(там в комментариях в некоторых местах указываю на какую строку ругается): Ошибка 5 error C2143: синтаксическая ошибка: отсутствие "}" перед "константа" c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 384
// 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
Ошибка 4 error C2011: sockaddr: переопределение типа "struct" c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 206
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;
А вот здесь вроде как и справедливая ошибка: Ошибка 8 error C2143: синтаксическая ошибка: отсутствие ";" перед "}" c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 437
//
//  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;
Ошибка 9 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 437
//
//  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
Ошибка 64 error C2375: WSAStartup: переопределение; другая компоновка c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h 2145
/* 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 */
Ну вобщем вот такие ошибки и их всего 69. Кстати, в VC++ в Проект/Свойства/Компоновщик/Общие/Дополнительные каталоги библиотек я поставил wsock32.lib , а также это я поставил wsock32.dll в Проект/Свойства/Компоновщик/Ввод/Добавить модуль в сборку (пробовал сюда ставить wsock32.lib вместо wsock32.dll , а также пробовал и то и другое ставить). Подскажите, пожалуйста, что может быть не так. Просто я полный ноль в этом деле, уже 2 дня морочусь и никак не могу понять что до чего. Может у кого-то есть примеры сервера и клиента для Виндовс, то буду признателен если пришлете, так на примере будет легче понять. Заранее благодарю за внимание.

Решение задачи: «Сокеты в 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 );
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы