我直接建立了win32 application工程中编写的过程化程序,没有用MFC,我编写了winsocket程序,但是总提示一些头文件没有定义,或者什么函数重复地定义...两个代码如下(一个是server的,一个是client的):client端的程序:
//#include"windows.h"
#include <winsock2.h>
#include <sys/types.h>
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#pragma comment (lib,"ws2_32.lib")
#define USERPORT 10001
#define HOST_IP_ADDR "192.1.1.2"
main(int argc, char **argv)
{
char buf[1024];
struct sockaddr_in client;
struct sockaddr_in server;
int s;
int ns;
int namelen;
int pktlen;
if ((s=socket(AF_INET, SOCK_STREAM, 0))<0)
{
perror("Socket()");
return;
}
bzero((char *)&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(USERPORT);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *)&server, sizeof(server))<0)
{
perror("Bind()");
return;
}
if (listen(s,1)!=0)
{
perror("Listen()");
return;
}
namelen = sizeof(client);
if ((ns = accept(s, (struct sockaddr *)&client, &namelen)) ==-1)
{
perror("Accept()");
return;
}
for (;;)
{
if ((pktlen = recv(ns,buf,1024,0))<0)
{
perror("Recv()");
break;
}
else
if (pktlen == 0)
{
printf("Recv():return FAILED,connection is shut down!\n");
break;
}
else
printf("Recv():return SUCCESS,packet length = %d\n",pktlen);
sleep(1);
if (send(ns,buf,pktlen,0)<0)
{
perror("Send()");
break;
}
else
printf("Send():return SUCCESS,packet length = %d\n",pktlen);
}
close(ns);
close(s);
printf("Server ended successfully\n");
}
程序可能比较多,但是只是请问一下,不用MFC来编写WINsocket程序,需要设置什么或者连接什么?多谢了

解决方案 »

  1.   

    server端:
    //#include"windows.h"
    #include <winsock2.h>
    #pragma comment (lib,"ws2_32.lib")
    #define   USERPORT   10001   
      #define   IDM_START   101   
      #define   IDM_EXIT     102   
      #define   UM_SOCK   WM_USER   +   0X100   
      #include   <alloc.h>   
      #include   <mem.h>   
      #include   <windows.h>   
      #include   <winsock.h>   
      #define   MAJOR_VERSION   1   
      #define   MINOR_VERSION   2   
      #define   WSA_MAKEWORD(x,y)     ((y)*256+(x))   
      HANDLE   hInst;   
      char   server_address[256]   =   {0};   
      char   buffer[1024];   
      char   FAR   *   lpBuffer   =   &buffer[0];   
      SOCKET   s   =   0;   
      struct   sockaddr_in   dst_addr;   
      struct   hostent   far   *hostaddr;   
      struct   hostent   hostnm;   
      struct   servent   far   *sp;   
      int   count   =   0;   
      BOOL   InitApplication(HINSTANCE   hInstance);   
      long   FAR   PASCAL   ClientProc(HWND   hWnd,   unsigned   message,   UINT   wParam,   LONG   lParam);   
      void   AlertUser(HWND   hWnd,   char   *message);   
      BOOL   Client(HWND   hWnd);   
      BOOL   ReceivePacket(HWND   hWnd);   
      BOOL   SetSelect(HWND   hWnd,   long   lEvent);   
      BOOL   SendPacket(HWND   hWnd,   int   len);   
      int   PASCAL   WinMain(HANDLE   hInstance,   HANDLE   hPrevInstance,   LPSTR   lpCmdLine,   int   nCmdShow)   
      {   
      HWND   hWnd;   
      MSG   msg;   
      lstrcpy((LPSTR)server_address,   lpCmdLine);   
      if   (!hPrevInstance)   
      if   (!InitApplication(hInstance))   
      return   (FALSE);   
      hInst   =   hInstance;   
      hWnd   =   CreateWindow("ClientClass",   "Windows   ECHO   Client",   WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,   CW_USEDEFAULT,   CW_USEDEFAULT,   CW_USEDEFAULT,   NULL,   NULL, hInstance,   NULL);   
      if   (!hWnd)   
      return   (FALSE);   
      ShowWindow(hWnd,   nCmdShow);   
      UpdateWindow(hWnd);   
      PostMessage(hWnd,   WM_USER,   (WPARAM)0,   (LPARAM)0);   
      while   (GetMessage(&msg,   NULL,   NULL,   NULL))   
      {   
      TranslateMessage(&msg);   
      DispatchMessage(&msg);   
      }   
      return   (msg.wParam);   
      }   
      BOOL   InitApplication(HINSTANCE   hInstance)   
      {   
              WNDCLASS   WndClass;   
      char   *szAppName   =   "ClientClass";   
              //   fill   in   window   class   information   
      WndClass.lpszClassName   =   (LPSTR)szAppName;   
      WndClass.hInstance           =   hInstance;   
      WndClass.lpfnWndProc       =   ClientProc;   
      WndClass.hCursor               =   LoadCursor(NULL,   IDC_ARROW);   
      WndClass.hIcon                   =   LoadIcon(hInstance,   NULL);   
      WndClass.lpszMenuName     =   "ClientMenu";   
      WndClass.hbrBackground   =   GetStockObject(WHITE_BRUSH);   
      WndClass.style                   =   CS_HREDRAW   |   CS_VREDRAW;   
      WndClass.cbClsExtra         =   0;   
      WndClass.cbWndExtra         =   0;   
              //   register   the   class   
              if   (!RegisterClass(&WndClass))   
      return(FALSE);   
              return(TRUE);   
      }   
      long   FAR   PASCAL   ClientProc(HWND   hWnd,   unsigned   message,   UINT   wParam,   LONG   lParam)   
      {   
      int   length,   i;   
      WSADATA   wsaData;   
      int   Status;   
      switch   (message)   
      {   
      case   WM_USER:   
      {   
      WORD wMajorVersion,   wMinorVersion;   
      LPWSADATA lpmyWSAData;   
      WORD   VersionReqd;   
      int ret;  等等...............................内容太长,发不上去,请你只是看下头文件怎么设置(如果不用MFC的话..)  }   
      

  2.   

    #include <windows.h>
    #include <winsock2.h> 
    我写网络程序只用到这两个就行了我用的是VC6+Winsocket不用MFC封装的socket。
      

  3.   

    如果没有include"windows.h"的话错误是:
    c:\documents and settings\administrator\桌面\server\0.cpp(4) : fatal error C1083: Cannot open include file: 'sys/mntent.h': No such file or directory
    Error executing cl.exe.
    如果有include"windows.h"的话错误是:
    ..........................
            d:\vc98\include\winsock.h(793) : see declaration of 'WSASetBlockingHook'
    d:\vc98\include\winsock2.h(2158) : error C2375: 'WSACancelBlockingCall' : redefinition; different linkage
            d:\vc98\include\winsock.h(795) : see declaration of 'WSACancelBlockingCall'
    d:\vc98\include\winsock2.h(2180) : error C2375: 'WSAAsyncGetServByName' : redefinition; different linkage
            d:\vc98\include\winsock.h(797) : see declaration of 'WSAAsyncGetServByName'
    d:\vc98\include\winsock2.h(2207) : error C2375: 'WSAAsyncGetServByPort' : redefinition; different linkage
            d:\vc98\include\winsock.h(802) : see declaration of 'WSAAsyncGetServByPort'
    d:\vc98\include\winsock2.h(2233) : error C2375: 'WSAAsyncGetProtoByName' : redefinition; different linkage
            d:\vc98\include\winsock.h(806) : see declaration of 'WSAAsyncGetProtoByName'
    d:\vc98\include\winsock2.h(2258) : error C2375: 'WSAAsyncGetProtoByNumber' : redefinition; different linkage
            d:\vc98\include\winsock.h(810) : see declaration of 'WSAAsyncGetProtoByNumber'
    d:\vc98\include\winsock2.h(2283) : error C2375: 'WSAAsyncGetHostByName' : redefinition; different linkage
            d:\vc98\include\winsock.h(814) : see declaration of 'WSAAsyncGetHostByName'
    d:\vc98\include\winsock2.h(2310) : error C2375: 'WSAAsyncGetHostByAddr' : redefinition; different linkage
            d:\vc98\include\winsock.h(818) : see declaration of 'WSAAsyncGetHostByAddr'
    d:\vc98\include\winsock2.h(2333) : error C2375: 'WSACancelAsyncRequest' : redefinition; different linkage
            d:\vc98\include\winsock.h(822) : see declaration of 'WSACancelAsyncRequest'
    d:\vc98\include\winsock2.h(2353) : error C2375: 'WSAAsyncSelect' : redefinition; different linkage
            d:\vc98\include\winsock.h(824) : see declaration of 'WSAAsyncSelect'
    c:\documents and settings\administrator\桌面\server\0.cpp(4) : fatal error C1083: Cannot open include file: 'sys/mntent.h': No such file or directory
    Error executing cl.exe.0.obj - 59 error(s), 11 warning(s)
      

  4.   

    #include"windows.h"
    //#include <winsock2.h>
    #include <sys/types.h>
    #include <sys/mntent.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    //#pragma comment (lib,"ws2_32.lib")或者
    //#include"windows.h"
    #include <winsock2.h>
    #include <sys/types.h>
    #include <sys/mntent.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #pragma comment (lib,"ws2_32.lib")
    错误都是: fatal error C1083: Cannot open include file: 'sys/mntent.h': No such file or directory
    如果#include"windows.h"
    #include <winsock2.h>同时用的话,就 有59个重复定义的错误.....
      

  5.   

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <winsock2.h>  
    #pragma   comment(lib,"ws2_32.lib")
      

  6.   

    代码我已经传到空间了,我用的VC++6.0,只用#include“windows.h”和#include“winsocket2.h”的话也不行...
      

  7.   

    #include <sys/types.h>
    #include <sys/mntent.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h> --这些都是linux等平台上的,不是windows的
      

  8.   

    #include <windows.h> 
    #include <winsock2.h>  
    #pragma  comment(lib,"ws2_32.lib") 
    先写成这样,把其它包含都去掉,看看有什么错,再增加相应的头文件。
      

  9.   

    哦,上面这个是linux上的,但是下面这个(1楼的)是windows上的,
    同样提示 fatal error C1083: Cannot open include file: 'alloc.h': No such file or directory
    如果加上#include“windows.h",就又是59个错误了...
      

  10.   

    12楼的错误提示是  59个函数重复定义的错误跟上面错误一样,当然现在是说那个在windows上运行的程序就是(1楼的)
      

  11.   

    把其它头文件都去掉,只保留windows.h和winsock2.h。
      

  12.   

    #if !defined(USES_ACE)
    #if(_WIN32_WINNT >= 0x0400)
    #include <winsock2.h>
    #include <mswsock.h>
    #else
    #include <winsock.h>
    #endif //USES_ACE
    #endif /* _WIN32_WINNT >=  0x0400 */摘自windows.h可以看到如果使用了WSASend此类winsock2的功能是需要定义WINNT版本的至于USES_ACE是我自己定义的便于使用ACE库弄得你可以不必理会
      

  13.   

    你提供的源代码是那里弄来的,跨平台没有实现啊,以下四个文件,实现了跨平台的raw socket 通信方式运行编译时,主要修改ip和port
      

  14.   

    scompat.h
    /* scompat.h for Windows Developers Journal by Victor R. Volkman
       this code may be used freely with no restrictions on use */#ifndef _WIN32
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/tcp.h>
    #include <netdb.h>    
    #include <errno.h>
    #define SOCKET   int
    #define INVALID_SOCKET -1
    #define LPVOID  void *
    #define HANDLE  int
    #define closesocket close  
    #else
    #include <winsock.h>
    #endif
      

  15.   

    scompat.c
    /* Scompat.c for Windows Developers Journal by Victor R. Volkman
     * this code may be used freely with no restrictions on use
     *
     * Winsock compatability layer for Unix
     */#ifdef _WIN32
    #include <winsock.h>
    #else
    #include <errno.h>
    #endif#include <stdio.h>int InitSockets(void)
    {
    #ifdef _WIN32
        WSADATA wsaData;
        WORD wVersionRequested;
        int err;    /* Ask for Winsock 1.1 functionality */
        wVersionRequested = MAKEWORD( 1, 1 );
        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 ) {
          printf("Error %d: Winsock not available\n", err);
          return 1;
          }
    #endif
        return 0;
    }#ifndef _WIN32
    int WSAGetLastError(void)
    {
       return errno;
    }int WSACleanup(void)
    {
       return 0;
    }#endif
      

  16.   

    服务器端 server1.c
    /* Server1.c for Windows Developers Journal by Victor R. Volkman
     * this code may be used freely with no restrictions on use
     *
     * To build Win32 server   cl server1.c scompat.c /Z7 /MT
     * To build Unix server    cc server1.c scompat.c -o server1
     */#include <stdio.h>
    #include "scompat.h"/* try to tell linker where WinSock library is */
    #if defined(_MSC_VER)
    #   pragma comment(lib,"wsock32.lib")
    #elif defined(__BORLANDC__)
    #   pragma comment(lib,"mswsock.lib")
    #endif#define WSA_ERROR(x)  { printf("Error %d: %s\n", \
        WSAGetLastError(), x); return 1; }int ServerLoop(SOCKET sd_listen, int isMultiTasking);main(int argc, char **argv)
    {
        SOCKET sd_listen;
        int err;
        u_short iPort;
        struct sockaddr_in addr_srv;
        struct hostent *ptrHost;
        char *pszHost = "152.160.13.253";    iPort = (argc >= 2) ? atoi(argv[1]) : 9999;    InitSockets();
        sd_listen = socket(PF_INET, SOCK_STREAM, 0);
        if (sd_listen == INVALID_SOCKET) {
            printf("Error: out of socket resources\n");
            return 1;
            }
        if (atoi(pszHost)) {
            u_long ip_addr = inet_addr(pszHost);
            ptrHost = gethostbyaddr((char *)&ip_addr,
                         sizeof(u_long), AF_INET);
            }
        else
            ptrHost = gethostbyname(pszHost);    if (!ptrHost)
            WSA_ERROR("cannot resolve hostname")    addr_srv.sin_family = PF_INET;
        addr_srv.sin_addr.s_addr = htonl(INADDR_ANY);
        addr_srv.sin_port = htons(iPort);    err = bind(sd_listen, (const struct sockaddr *) &addr_srv,
                   sizeof(addr_srv));
        if (err == INVALID_SOCKET)
            WSA_ERROR("Error: unable to bind socket\n")    err = listen(sd_listen, SOMAXCONN);
        if (err == INVALID_SOCKET)
            WSA_ERROR("Error: listen failed\n")    ServerLoop(sd_listen, 1);
        printf("Server is down\n");
        WSACleanup();
        return 0;
    }
    void ServeAClient(LPVOID lpv)
    {
        SOCKET sd_accept = (SOCKET) lpv;
        const char *msg = "HELLO CLIENT";
        char response[4096];    memset(response, 0, sizeof(response));
        recv(sd_accept, response, sizeof(response), 0);
        if (strcmp(response, "HELLO SERVER")) {
            printf("Application:  client not using expected "
                "protocol %s\n", response);
          }
        else
            send (sd_accept, msg, strlen(msg)+1, 0);
        closesocket(sd_accept);
    }#define   MAX_SERVED         3int ServerLoop(SOCKET sd_listen, int isMultiTasking)
    {
        SOCKET sd_accept;
        struct sockaddr_in addr_client;
        int err, nSize;
        int numServed = 0;
        HANDLE handles[MAX_SERVED];
        int myID;    while (numServed < MAX_SERVED) {      nSize = sizeof(addr_client);
          sd_accept = accept(sd_listen, (struct sockaddr *)
                             &addr_client, &nSize);
          if (sd_accept == INVALID_SOCKET)
              WSA_ERROR("Error: accept failed\n")      printf("Accepted connection from client at %s\n",
                 inet_ntoa(addr_client.sin_addr));
          if (isMultiTasking) {
    #ifdef _WIN32
              handles[numServed] = CreateThread(NULL, 1000,
                          (LPTHREAD_START_ROUTINE)ServeAClient,
                          (LPVOID) sd_accept, 0, &myID);
    #else
              myID = fork();
              if (myID == 0) { /* I am child process */
                 ServeAClient ((LPVOID) sd_accept);
                 exit(0);
                 }
              handles[numServed] = myID;
    #endif
              }
          else
              ServeAClient((LPVOID) sd_accept);
          numServed++;
          }    if (isMultiTasking) {
    #ifdef _WIN32
            err = WaitForMultipleObjects(MAX_SERVED, handles,
                                         TRUE, INFINITE);
            printf("Last thread to finish was thread #%d\n", err);
    #endif
            }
        return 0;
    }
      

  17.   

    客户端 client1.c
    /* Client1.c for Windows Developers Journal by Victor R. Volkman
     * this code may be used freely with no restrictions on use
     *
     * To build Win32 client   cl client1.c scompat.c /Z7 /MT 
     * To build Unix client    cc client1.c scompat.c -o client1
     */#include <stdio.h>
    #include "scompat.h"/* try to tell linker where WinSock library is */
    #if defined(_MSC_VER)
    #   pragma comment(lib,"wsock32.lib")
    #elif defined(__BORLANDC__)
    #   pragma comment(lib,"mswsock.lib")
    #endif
    #define WSA_ERROR(x)  { printf("Error %d: %s\n", \
        WSAGetLastError(), x); return 1; }
    void InitSockets(void);
    main(int argc, char **argv)
    {
        SOCKET sd_client;
        int err;
        u_short iPort;
        struct sockaddr_in addr_srv;
        struct hostent *ptrHost;
        char response[4096];
        char *pszHost;
        char *msg = "HELLO SERVER";    if (argc == 3) {
          pszHost = argv[1];
          iPort = atoi(argv[2]);
          }
        else {
          printf("Usage:\t client1 [hostname] [portno]");
          return 1;
          }    InitSockets();
        sd_client = socket(PF_INET, SOCK_STREAM, 0);
        if (sd_client == INVALID_SOCKET)
            WSA_ERROR("no more socket resources")    if (atoi(pszHost)) {
            u_long ip_addr = inet_addr(pszHost);
            ptrHost = gethostbyaddr((char *)&ip_addr,
                sizeof(u_long), AF_INET);
            }
        else
            ptrHost = gethostbyname(pszHost);    if (!ptrHost)
            WSA_ERROR("cannot resolve hostname")    addr_srv.sin_family = PF_INET;
        memcpy((char *) &(addr_srv.sin_addr),
            ptrHost->h_addr,  ptrHost->h_length);
        addr_srv.sin_port = htons(iPort);    err = connect(sd_client, (struct sockaddr *) &addr_srv,
            sizeof(addr_srv));
        if (err == INVALID_SOCKET)
            WSA_ERROR("cannot connect to server")    printf("You are connected to the server\n");
        send (sd_client, msg, strlen(msg)+1, 0);
        memset(response, 0, sizeof(response));
        recv(sd_client, response, sizeof(response), 0);
        printf("server says %s\n", response);
        closesocket(sd_client);
        WSACleanup();
        return 0;
    }
      

  18.   

    Linking...
    c.obj : error LNK2001: unresolved external symbol "void __cdecl InitSockets(void)" (?InitSockets@@YAXXZ)
    Debug/cccc.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.cccc.exe - 2 error(s), 0 warning(s)
    这是楼上程序出现的错误提示...
      

  19.   

    InitSockets函数在文件 compat.c 你吧这个文件也要加到你的工程里面
      

  20.   

    哦,是scompat.c 参见20楼代码
      

  21.   

    #include <sys/types.h> 
    #include <sys/mntent.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <arpa/inet.h> 
    是LINUX头文件,你去了#ifndef
      

  22.   

    #define WIN32_LEAN_AND_MEAN 
    #include <windows.h> 若不跨平台先注释掉linux下采用到的文件
      

  23.   

    如15楼所说,只要这两个头文件就够了,
    当然如果你用了其他的东西就要其他的文件头,不过socket的上面两个就够了