我想写一个基于c/s结构的程序,使用udp协议,不想使用mfc。主要实现client发送消息给server,server接收消息这一功能.
请教大家一下,以下客户端和服务端的代码是否正确!
//////////////////////////////////
客户端的程序,可以发送数据
 LocalSock = socket(AF_INET, SOCK_DGRAM, 0); 
 LocalAddress.sin_family = AF_INET;
 LocalAddress.sin_port   = htons(CONNECT_PORT);
 LocalAddress.sin_addr.S_un.S_addr  = inet_addr( GetLocalIPAddress() );
 这里到底要使用哪一句?? 
  //LocalAddress.sin_addr.S_un.S_addr  = htonl( INADDR_ANY);//
  bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
//设置服务器的ip地址,我察看了内存RemoteAddress.sin_addr.S_un.S_addr设置正确
 RemoteAddress.sin_family = AF_INET;
 RemoteAddress.sin_port  = htons(CONNECT_PORT);
 RemoteAddress.sin_addr.S_un.S_addr = inet_addr( m_chRemoteIPAddress );
 numWritten = sendto(LocalSock, (char *)buf , strlen(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , sizeof(RemoteAddress) );///////////////////////////
服务器端程序,老是接收不到消息????为什么
 //初始化本地地址,将其和LocalSock连接 
 LocalSock = socket(AF_INET, SOCK_DGRAM, 0); 
 LocalAddress.sin_family = AF_INET;
 LocalAddress.sin_port   = htons(CONNECT_PORT);
 LocalAddress.sin_addr.S_un.S_addr  = inet_addr( GetLocalIPAddress() );
 这里到底要使用哪一句?? 
//LocalAddress.sin_addr.S_un.S_addr  = htonl( INADDR_ANY);//
 bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
 ret = recvfrom(LocalSock , (char*)buf , sizeof(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , &addr_size );////////////////////////
大家看看,到底问题出在那??为什么服务端老是接收不到信息???
谢谢

解决方案 »

  1.   

    如果有那位朋友知道,哪里有比较好的基于udp协议的类或者是例子,请告诉我一声!
    但是不要使用mfc!
    谢谢
      

  2.   

    //////////////////////////////////
    客户端的程序,可以发送数据
    ########## 如果客户端不接收数据以下四行包括bind那一行,全不要
     LocalSock = socket(AF_INET, SOCK_DGRAM, 0); 
     LocalAddress.sin_family = AF_INET;
     LocalAddress.sin_port   = htons(CONNECT_PORT);
     LocalAddress.sin_addr.S_un.S_addr  = inet_addr( GetLocalIPAddress() );
     这里到底要使用哪一句?? 
      //LocalAddress.sin_addr.S_un.S_addr  = htonl( INADDR_ANY);//
      bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)//设置服务器的ip地址,我察看了内存RemoteAddress.sin_addr.S_un.S_addr设置正确
     RemoteAddress.sin_family = AF_INET;
     RemoteAddress.sin_port  = htons(CONNECT_PORT);
     RemoteAddress.sin_addr.S_un.S_addr = inet_addr( m_chRemoteIPAddress );
     numWritten = sendto(LocalSock, (char *)buf , strlen(buf) , 0 ,
    (LPSOCKADDR)&RemoteAddress , sizeof(RemoteAddress) );///////////////////////////
    服务器端程序,老是接收不到消息????为什么
     //初始化本地地址,将其和LocalSock连接 
     LocalSock = socket(AF_INET, SOCK_DGRAM, 0); 
     LocalAddress.sin_family = AF_INET;
     LocalAddress.sin_port   = htons(CONNECT_PORT);
     LocalAddress.sin_addr.S_un.S_addr  = inet_addr( GetLocalIPAddress() );
     这里到底要使用哪一句?? ############# 使用下一句!!!
    //LocalAddress.sin_addr.S_un.S_addr  = htonl( INADDR_ANY);//
     bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
     ret = recvfrom(LocalSock , (char*)buf , sizeof(buf) , 0 ,
    (LPSOCKADDR)&RemoteAddress , &addr_size );
      

  3.   

    我有程序,你留个EMAIL, 我发给你!
      

  4.   

    谢谢 xstring(麻雀  的回答
    我试看看
      

  5.   

    to xstring(麻雀)  我按照你的方法试了,还是不行!为什么我也感觉很奇怪!
    LocalAddress.sin_addr.S_un.S_addr  = htonl( INADDR_ANY)
    这句话,是不是表示服务端可以接受任何地址的请求??
      

  6.   

    这是我写的一个小例子,可以正常工作你照着改把/*
      udp.cpp
    */#include <stdio.h>
    #include <windows.h>
    #include <winsock.h>#pragma comment (lib, "ws2_32.lib")int main (void)
        {
            char buf [0x1000];
            WSADATA wsa;
            WSAStartup (MAKEWORD (2, 2), &wsa);        SOCKET clnt = ::socket (AF_INET, SOCK_DGRAM, 0);
            SOCKET serv = ::socket (AF_INET, SOCK_DGRAM, 0);        sockaddr_in sa_clnt, sa_serv;        memset (&sa_clnt, 0, sizeof (sa_clnt));
            memset (&sa_serv, 0, sizeof (sa_serv));        sa_clnt.sin_family  = AF_INET;
            sa_clnt.sin_port    = htons (1234);
            sa_clnt.sin_addr.s_addr = inet_addr ("127.0.0.1");        bind (clnt, (sockaddr *)&sa_clnt, sizeof (sa_clnt));        sa_serv.sin_family  = AF_INET;
            sa_serv.sin_port    = htons (4321);
            sa_serv.sin_addr.s_addr = inet_addr ("127.0.0.1");        bind (serv, (sockaddr *)&sa_serv, sizeof (sa_serv));        //  客户端发送消息到服务端
            sendto (clnt, "我是客户端", sizeof ("我是客户端"), 
                0, (sockaddr *)&sa_serv, sizeof (sa_serv));        //  服务端接收消息, 如果要得到消息来源,请使用recvfrom
            recv (serv, buf, sizeof (buf), 0);
            printf ("服务端接收到客户端的消息:%s\n", buf);        //  服务端发送消息到客户端
            sendto (serv, "我是服务端", sizeof ("我是服务端"), 0, 
                (sockaddr *)&sa_clnt, sizeof (sa_clnt));        //  客户端接收消息, 如果要得到消息来源,请使用recvfrom
            recv (clnt, buf, sizeof (buf), 0);
            printf ("客户端接收到服务端的消息:%s\n", buf);        closesocket (clnt);
            closesocket (serv);
            WSACleanup ();
        };
      

  7.   

    谢谢 : xstring(麻雀) 
    你的程序太好了,给我很大的帮助。在这里我还有几个问题要请教你!
    1。sa_clnt.sin_port    = htons (1234);
      sa_serv.sin_port    = htons (4321);
    这里的1234与4321是什么关系,是巧合。还是要有字节顺序???
    2。recv是阻塞的,而recv是非阻塞的。是吗?
      

  8.   

    谢谢 : xstring(麻雀) 
    你的程序太好了,给我很大的帮助。在这里我还有几个问题要请教你!
    1。sa_clnt.sin_port    = htons (1234);
      sa_serv.sin_port    = htons (4321);
    这里的1234与4321是什么关系,是巧合。还是要有字节顺序???
    2。recv是阻塞的,而recv是非阻塞的。是吗?
      

  9.   

    1、没关系,只是让它们不同而已2、阻塞和不阻塞和recv, recvfrom无关
      

  10.   

    to xstring(麻雀) 
    你个我的那个例子在本机上,我把他分成两个两个程序,可以通讯!
    但是问题是我把他放到两台不同的机器上,却不行了
    为什么!
    ip地址我可是改了
      

  11.   

    //////////客户端程序
    sa_clnt.sin_family  = AF_INET;
    sa_clnt.sin_port    = htons (1234);
    sa_clnt.sin_addr.s_addr = inet_addr ("客户端地址");
    bind (clnt, (sockaddr *)&sa_clnt, sizeof (sa_clnt));

    sa_serv.sin_family  = AF_INET;
    sa_serv.sin_port    = htons (4321);
    sa_serv.sin_addr.s_addr = inet_addr ("服务器地址");

    bind (serv, (sockaddr *)&sa_serv, sizeof (sa_serv));

    //  客户端发送消息到服务端
    sendto (clnt, "我是客户端", sizeof ("我是客户端"), 
    0, (sockaddr *)&sa_serv, sizeof (sa_serv));
      

  12.   

    分开写是这样的,可能会有手误的地方,有的话,自己改改吧客户端
    #include <stdio.h>
    #include <windows.h>
    #include <winsock.h>#pragma comment (lib, "ws2_32.lib")int main (void)
        {
            char buf [0x1000];
            WSADATA wsa;
            WSAStartup (MAKEWORD (2, 2), &wsa);        SOCKET clnt = ::socket (AF_INET, SOCK_DGRAM, 0);        sockaddr_in sa_clnt, sa_serv;        memset (&sa_clnt, 0, sizeof (sa_clnt));
            memset (&sa_serv, 0, sizeof (sa_serv));        sa_clnt.sin_family      = AF_INET;
            sa_clnt.sin_port        = htons (1234);
            sa_clnt.sin_addr.s_addr = 0;        bind (clnt, (sockaddr *)&sa_clnt, sizeof (sa_clnt));        sa_serv.sin_family      = AF_INET;
            sa_serv.sin_port        = htons (4321);
            sa_serv.sin_addr.s_addr = inet_addr ("服务端IP"); // 你自己改        //  客户端发送消息到服务端
            sendto (clnt, "我是客户端", sizeof ("我是客户端"), 
                0, (sockaddr *)&sa_serv, sizeof (sa_serv));        //  客户端接收消息, 如果要得到消息来源,请使用recvfrom
            recv (clnt, buf, sizeof (buf), 0);
            printf ("客户端接收到服务端的消息:%s\n", buf);        closesocket (clnt);
            WSACleanup ();
        };
        
    服务端
    #include <stdio.h>
    #include <windows.h>
    #include <winsock.h>#pragma comment (lib, "ws2_32.lib")int main (void)
        {
            char buf [0x1000];
            WSADATA wsa;
            WSAStartup (MAKEWORD (2, 2), &wsa);        SOCKET serv = ::socket (AF_INET, SOCK_DGRAM, 0);        sockaddr_in sa_clnt, sa_serv;        memset (&sa_clnt, 0, sizeof (sa_clnt));
            memset (&sa_serv, 0, sizeof (sa_serv));        sa_clnt.sin_family      = AF_INET;
            sa_clnt.sin_port        = htons (1234);
            sa_clnt.sin_addr.s_addr = inet_addr ("客户端IP");   //  你自己改        sa_serv.sin_family      = AF_INET;
            sa_serv.sin_port        = htons (4321);
            sa_serv.sin_addr.s_addr = 0;        bind (serv, (sockaddr *)&sa_serv, sizeof (sa_serv));        //  服务端接收消息, 如果要得到消息来源,请使用recvfrom
            recv (serv, buf, sizeof (buf), 0);
            printf ("服务端接收到客户端的消息:%s\n", buf);        //  服务端发送消息到客户端
            sendto (serv, "我是服务端", sizeof ("我是服务端"), 0, 
                (sockaddr *)&sa_clnt, sizeof (sa_clnt));        closesocket (serv);
            WSACleanup ();
        };