Strange behavior with sockets.

From: Herve Soulard <Herve.Soulard_at_inria.fr>
Date: Fri, 8 Sep 1995 14:11:19 +0200

Hello,

I have a strange behavior with socket (TCP) use on OSF1 on alpha,
DEC OSF/1 V3.0 (Rev. 347).

Basically, the two programs (osock & isock) included below act as
a client and a server, respectively, connected by a TCP socket; they
do the following:


        Host 1 Host 2

        osock isock
        ----- -----

        get time1 wait for a
                                        message
        send N messages
        of X bytes --------------> receive message
        & wait for an
        return
                                        send back a message
        receive msg <-------------- of 16 bytes

        get time2

         display time2-time1


The result of this simple sequence is a time that varies
widely.

For example, sending 60 messages of 10240 bytes gives me:

        try 1 = 37 ms
        try 2 = 1107 ms
        try 3 = 610 ms
        try 4 = 28 ms

I cannot explain this. If somebody has an answer to this
problem....

Note that it depends of the size of the message and of the
number of messages sent. It works fine on SunOS

                Herve Soulard.

----------------------------------------------------------------
/*
   osock.c : the client part.

   Send 'loop' messages of 'len' bytes, then wait for a
   message of 16 bytes.

   Usage: osock host port loop len
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>

char buffer[1000000];

main (int argc, char **argv)
{
    struct sockaddr_in dest;
    struct hostent *host;
    struct in_addr ina;

    int i, j, w;

    struct timeval start;
    struct timeval end;
    unsigned long diff;

    int fd, loop, len;

    host = gethostbyname(argv[1]);
    
    fd = socket(AF_INET,SOCK_STREAM,0);

    dest.sin_family = AF_INET;
    bcopy(host->h_addr, &dest.sin_addr, host->h_length);
    dest.sin_port = atoi(argv[2]);

    connect(fd, &dest, sizeof dest);

    loop = atoi(argv[3]);
    len = atoi(argv[4]);

    gettimeofday(&start, (struct timezone *)0);

    for (w = 0; w < loop; w++) {
        j = send(fd, buffer, len, 0);
        i = 0;
        do {
            j = recv(fd, buffer, 16, 0);
            i += j;
        } while (i < 16);
    }
    
    gettimeofday(&end, (struct timezone *)0);

    diff = (end.tv_sec - start.tv_sec)*100 +
           (end.tv_usec - start.tv_usec)/10000;

    printf("\nTime = %9lu ms \n", diff);

    close(fd);
}
----------------------------------------------------------------
----------------------------------------------------------------
/*
   isock.c : the server part.

   Wait for a message of 'len' bytes, then return a
   message of 16 bytes.

   Usage: isock port len
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

char buffer[1000000];

void readMsg(int fd, int len)
{
    int i, j;
    
    for (;;) {
        i = 0;
        do {
            j = recv(fd, buffer, len, 0);
            if (j == 0) {
                close (fd);
                return ;
            }
            i += j;
        }
        while (i < len);
        j = send(fd, buffer, 16, 0);
    }
}


main (int argc, char **argv)
{
    int s, l, fd;
    struct sockaddr_in dest,source;

    s = socket(AF_INET,SOCK_STREAM,0);

    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = INADDR_ANY;
    dest.sin_port = atoi(argv[1]);

    bind(s, &dest, sizeof dest);

    getsockname(s, &dest, &l);

    listen(s, 10);

    do {
        l = sizeof source;
        fd = accept(s, &source, &l);
        readMsg(fd, atoi(argv[3]));
    } while (1);
}
----------------------------------------------------------------
Received on Fri Sep 08 1995 - 14:40:29 NZST

This archive was generated by hypermail 2.4.0 : Wed Nov 08 2023 - 11:53:45 NZDT