谁能给一个用TCP/IP发送数据包和接收数据包的例子啊!email:[email protected]

解决方案 »

  1.   

    你自己看看下面的这个例子,有源代码的:
    http://www.vczx.com/article/show.php?id=1041
      

  2.   

    // Module Name: Sender.c
    //
    // Description:
    //    This sample sends UDP datagrams to the specified recipient.
    //    The -c option first calls connect() to associate the 
    //    recipient's IP address with the socket handle so that the 
    //    send() function can be used as opposed to the sendto() call.
    //
    // Compile:
    //    cl -o Sender Sender.c ws2_32.lib
    //
    // Command line options:
    //    sender [-p:int] [-r:IP] [-c] [-n:x] [-b:x] [-d:c]
    //           -p:int   Remote port
    //           -r:IP    Recipient's IP address or hostname
    //           -c       Connect to remote IP first
    //           -n:x     Number of times to send message
    //           -b:x     Size of buffer to send
    //           -d:c     Character to fill buffer with
    //
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>#define DEFAULT_PORT            5150
    #define DEFAULT_COUNT           25
    #define DEFAULT_CHAR            'a'
    #define DEFAULT_BUFFER_LENGTH   64BOOL  bConnect = FALSE;                 // Connect to recipient first
    int   iPort    = DEFAULT_PORT;          // Port to send data to
    char  cChar    = DEFAULT_CHAR;          // Character to fill buffer 
    DWORD dwCount  = DEFAULT_COUNT,         // Number of messages to send
          dwLength = DEFAULT_BUFFER_LENGTH; // Length of buffer to send
    char  szRecipient[128] = "127.0.0.1";                 // Recipient's IP or hostname//
    // Function: usage
    //
    // Description:
    //    Print usage information and exit
    //
    void usage()
    {
        printf("usage: sender [-p:int] [-r:IP] "
       "[-c] [-n:x] [-b:x] [-d:c]\n\n");
        printf("       -p:int   Remote port\n");
        printf("       -r:IP    Recipients IP address or hostname\n");
        printf("       -c       Connect to remote IP first\n");
        printf("       -n:x     Number of times to send message\n");
        printf("       -b:x     Size of buffer to send\n");
        printf("       -d:c     Character to fill buffer with\n\n");
        ExitProcess(1);
    }//
    // Function: ValidateArgs
    //
    // Description:
    //    Parse the command line arguments, and set some global flags to
    //    indicate what actions to perform
    //
    void ValidateArgs(int argc, char **argv)
    {
        int i;    for(i = 1; i < argc; i++)
        {
            if ((argv[i][0] == '-') || (argv[i][0] == '/'))
            {
                switch (tolower(argv[i][1]))
                {
                    case 'p':        // Remote port
                        if (strlen(argv[i]) > 3)
                            iPort = atoi(&argv[i][3]);
                        break;
                    case 'r':        // Recipient's IP addr
                        if (strlen(argv[i]) > 3)
                            strcpy(szRecipient, &argv[i][3]);
                        break;
                    case 'c':        // Connect to recipients IP addr
                        bConnect = TRUE;
                        break;
                    case 'n':        // Number of times to send message
                        if (strlen(argv[i]) > 3)
                            dwCount = atol(&argv[i][3]);
                        break;
                    case 'b':        // Buffer size
                        if (strlen(argv[i]) > 3)
                            dwLength = atol(&argv[i][3]);
                        break;
                    case 'd': // Character to fill buffer
                        cChar = argv[i][3];
                        break;
                    default:
                        usage();
                        break;
                }
            }
        }
    }//
    // Function: main
    //
    // Description:
    //    Main thread of execution. Initialize Winsock, parse the command
    //    line arguments, create a socket, connect to the remote IP
    //    address if specified, and then send datagram messages to the
    //    recipient.
    //
    #pragma  comment(lib, "Ws2_32")
    int main(int argc, char **argv)
    {
        WSADATA        wsd;
        SOCKET         s;
        char          *sendbuf = NULL;
        int            ret,
                       i;
        SOCKADDR_IN    recipient;    // Parse the command line and load Winsock
        //
        ValidateArgs(argc, argv);    if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
        {
            printf("WSAStartup failed!\n");
            return 1;
        }
        // Create the socket
        //
        s = socket(AF_INET, SOCK_DGRAM, 0);
        if (s == INVALID_SOCKET)
        {
            printf("socket() failed; %d\n", WSAGetLastError());
            return 1;
        }
        // Resolve the recipient's IP address or hostname
        //
        recipient.sin_family = AF_INET;
        recipient.sin_port = htons((short)iPort);
        if ((recipient.sin_addr.s_addr = inet_addr(szRecipient))
    == INADDR_NONE)
        {
            struct hostent *host=NULL;        host = gethostbyname(szRecipient);
            if (host)
                CopyMemory(&recipient.sin_addr, host->h_addr_list[0],
                    host->h_length);
            else
            {
                printf("gethostbyname() failed: %d\n", WSAGetLastError());
                WSACleanup();
                return 1;
            }
        }
        // Allocate the send buffer
        //
        sendbuf = (char*)GlobalAlloc(GMEM_FIXED, dwLength);
        if (!sendbuf)
        {
            printf("GlobalAlloc() failed: %d\n", GetLastError());
            return 1;
        }
        memset(sendbuf, cChar, dwLength);
        //
        // If the connect option is set, "connect" to the recipient
        // and send the data with the send() function
        //
        if (bConnect)
        {
            if (connect(s, (SOCKADDR *)&recipient, 
                    sizeof(recipient)) == SOCKET_ERROR)
            {
                printf("connect() failed: %d\n", WSAGetLastError());
                GlobalFree(sendbuf);
                WSACleanup();
                return 1;
            }
            for(i = 0; i < dwCount; i++)
            {
                ret = send(s, sendbuf, dwLength, 0);
                if (ret == SOCKET_ERROR)
                {
                    printf("send() failed: %d\n", WSAGetLastError());
                    break;
                }
                else if (ret == 0)
                    break;
                // send() succeeded!
            }
        }
        else
        {
            // Otherwise, use the sendto() function
            //
            for(i = 0; i < dwCount; i++)
            {
                ret = sendto(s, sendbuf, dwLength, 0, 
                        (SOCKADDR *)&recipient, sizeof(recipient));
                if (ret == SOCKET_ERROR)
                {
                    printf("sendto() failed; %d\n", WSAGetLastError());
                    break;
                }
                else if (ret == 0)
                    break;
                // sendto() succeeded!
            }
        }
        closesocket(s);    GlobalFree(sendbuf);
        WSACleanup();
        return 0;
    }
      

  3.   

    // Module Name: Receiver.c
    //
    // Description:
    //    This sample receives UDP datagrams by binding to the specified
    //    interface and port number and then blocking on a recvfrom() 
    //    call
    //
    // Compile:
    //    cl -o Receiver Receiver.c ws2_32.lib
    //
    // Command line options:
    //    sender [-p:int] [-i:IP][-n:x] [-b:x]
    //           -p:int   Local port
    //           -i:IP    Local IP address to listen on
    //           -n:x     Number of times to send message
    //           -b:x     Size of buffer to send
    //
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>#define DEFAULT_PORT            5150
    #define DEFAULT_COUNT           25
    #define DEFAULT_BUFFER_LENGTH   4096int   iPort    = DEFAULT_PORT;          // Port to receive on
    DWORD dwCount  = DEFAULT_COUNT,         // Number of messages to read
          dwLength = DEFAULT_BUFFER_LENGTH; // Length of receiving buffer
    BOOL  bInterface = FALSE;               // Use an interface other than
                                            // default
    char  szInterface[32] = "127.0.0.1";            // Interface to read datagrams from//
    // Function: usage:
    //
    // Description:
    //    Print usage information and exit
    //
    void usage()
    {
        printf("usage: sender [-p:int] [-i:IP][-n:x] [-b:x]\n\n");
        printf("       -p:int   Local port\n");
        printf("       -i:IP    Local IP address to listen on\n");
        printf("       -n:x     Number of times to send message\n");
        printf("       -b:x     Size of buffer to send\n\n");
        ExitProcess(1);
    }//
    // Function: ValidateArgs
    //
    // Description:
    //    Parse the command line arguments, and set some global flags to
    //    indicate what actions to perform
    //
    void ValidateArgs(int argc, char **argv)
    {
        int                i;    for(i = 1; i < argc; i++)
        {
            if ((argv[i][0] == '-') || (argv[i][0] == '/'))
            {
                switch (tolower(argv[i][1]))
                {
                    case 'p':   // Local port
                        if (strlen(argv[i]) > 3)
                            iPort = atoi(&argv[i][3]);
                        break;
                    case 'n':   // Number of times to receive message
                        if (strlen(argv[i]) > 3)
                            dwCount = atol(&argv[i][3]);
                        break;
                    case 'b':   // Buffer size
                        if (strlen(argv[i]) > 3)
                            dwLength = atol(&argv[i][3]);
                        break;
    case 'i': // Interface to receive datagrams on
    if (strlen(argv[i]) > 3)
    {
    bInterface = TRUE;
    strcpy(szInterface, &argv[i][3]);
    }
    break;
                    default:
                        usage();
                        break;
                }
            }
        }
    }//
    // Function: main
    //
    // Description:
    //    Main thread of execution. Initialize Winsock, parse the command
    //    line arguments, create a socket, bind it to a local interface 
    //    and port, and then read datagrams.
    //
    #pragma  comment (lib, "Ws2_32")
    int main(int argc, char **argv)
    {
        WSADATA        wsd;
        SOCKET         s;
        char          *recvbuf = NULL;
        int            ret,
                       i;
        //DWORD          dwSenderSize;
    int  dwSenderSize;
        SOCKADDR_IN    sender,
       local;    // Parse arguments and load Winsock
        //
        ValidateArgs(argc, argv);    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
        {
            printf("WSAStartup failed!\n");
            return 1;
        }
        // Create the socket and bind it to a local interface and port
        //
        s = socket(AF_INET, SOCK_DGRAM, 0);
        if (s == INVALID_SOCKET)
        {
            printf("socket() failed; %d\n", WSAGetLastError());
            return 1;
        }
        local.sin_family = AF_INET;
        local.sin_port = htons((short)iPort);
        if (bInterface)
            local.sin_addr.s_addr = inet_addr(szInterface);
        else
    local.sin_addr.s_addr = htonl(INADDR_ANY); sender.sin_addr.s_addr = inet_addr(szInterface);
        if (bind(s, (SOCKADDR *)&local, sizeof(local)) == SOCKET_ERROR)
        {
    printf("bind() failed: %d\n", WSAGetLastError());
    return 1;
        }
        // Allocate the receive buffer
        //
        recvbuf = (char*)GlobalAlloc(GMEM_FIXED, dwLength);
        if (!recvbuf)
        {
            printf("GlobalAlloc() failed: %d\n", GetLastError());
            return 1;
        }
        // Read the datagrams
        //
        for(i = 0; i < dwCount; i++)
        {
            dwSenderSize = sizeof(sender);
            ret = recvfrom(s, recvbuf, dwLength, 0, 
                    (SOCKADDR *)&local, &dwSenderSize);
            if (ret == SOCKET_ERROR)
            {
                printf("recvfrom() failed; %d\n", WSAGetLastError());
                break;
            }
            else if (ret == 0)
                break;
    else
    {
    recvbuf[ret] = '\0';
    printf("[%s] sent me: '%s'\n", 
    inet_ntoa(sender.sin_addr), recvbuf);
    }
        }
        closesocket(s);    GlobalFree(recvbuf);
        WSACleanup();
        return 0;
    }