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