Date: Wed, 11 Sep 2002 14:10:12 -0400 From: "kfl" <kfl@xiphos.ca> To: "freebsd - net" <freebsd-net@FreeBSD.org> Subject: T/TCP and FreeBSD 4.5 Message-ID: <JCEDLMKGMLLELHAJNIHJCEBJDGAA.kfl@xiphos.ca>
next in thread | raw e-mail | index | archive | help
Hi, I'm having a problem using TCP for transaction in FreeBSd 4.5. Here's a trace from tcpdump and the code I'm using. Also, from the dump you can see that rfc1644 is on ;) Problem: (At 12:41:05.626586, the ack should also ack the data sent with the SYN.) Any hints on what could be wrong? Regards, Karim Fodil-Lemelin Xiphos Technologies Inc. uname -a: cartman.xiphos.ca 4.5-RELEASE FreeBSD 4.5-RELEASE #0: Mon Jan 28 14:31:56 GMT 2002 murray@builder.freebsdmall.com:/usr/src/sys/compile/GENERIC i386 TRACE: 12:41:05.626087 cartman.xiphos.ca.1029 > ratbert.xiphos.ca.8888: SFP 361776143:361776543(400) win 65535 <mss 1460,nop,wscale 1,nop,nop,timestamp 145150 0,nop,nop,cc 7> (DF) 12:41:05.626293 ratbert.xiphos.ca.8888 > cartman.xiphos.ca.1029: S 1733428688:1733428688(0) ack 361776144 win 65535 <mss 1460,nop,wscale 1,nop,nop,timestamp 143990 145150,nop,nop,cc 6,nop,nop,ccecho 7> 12:41:05.626451 cartman.xiphos.ca.1029 > ratbert.xiphos.ca.8888: F 361776544:361776544(0) ack 1733428689 win 33120 <nop,nop,timestamp 145150 143990,nop,nop,cc 7> (DF) 12:41:05.626586 ratbert.xiphos.ca.8888 > cartman.xiphos.ca.1029: . ack 361776144 win 33120 <nop,nop,timestamp 143990 145150,nop,nop,cc 6> (DF) 12:41:06.625726 cartman.xiphos.ca.1029 > ratbert.xiphos.ca.8888: FP 361776144:361776544(400) ack 1733428689 win 33120 <nop,nop,timestamp 145250 143990,nop,nop,cc 7> (DF) 12:41:06.625831 ratbert.xiphos.ca.8888 > cartman.xiphos.ca.1029: . ack 361776545 win 32920 <nop,nop,timestamp 144090 145250,nop,nop,cc 6> (DF) 12:41:06.626626 ratbert.xiphos.ca.8888 > cartman.xiphos.ca.1029: FP 1733428689:1733429089(400) ack 361776545 win 33120 <nop,nop,timestamp 144090 145250,nop,nop,cc 6> (DF) 12:41:06.626818 cartman.xiphos.ca.1029 > ratbert.xiphos.ca.8888: . ack 1733429090 win 32920 <nop,nop,timestamp 145250 144090,nop,nop,cc 7> (DF) INCLUDE FILE: /* Common includes and defines for UDP, TCP, and T/TCP */ /* clients and servers */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define REQUEST 400 /* max size of request, in bytes */ #define REPLY 400 /* max size of reply, in bytes */ #define UDP_SERV_PORT 7777 /* UDP server's well-known port */ #define TCP_SERV_PORT 8888 /* TCP server's well-known port */ #define TTCP_SER_PORT 9999 /* T/TCP server's well-known port */ /* Following shortens all the type casts of pointer arguments */ #define SA struct sockaddr * CLIENT: int read_stream (int fd, char *ptr, int maxbytes) { int nleft, nread; nleft = maxbytes; while (nleft > 0) { if ((nread = read(fd, ptr, nleft)) < 0) return (nread); /* error return < 0 */ else if (nread == 0) break; /* EOF, return #bytes read */ nleft -= nread; ptr += nread; } return (maxbytes - nleft); } int main (int argc, char *argv[]) { struct sockaddr_in serv; struct hostent *host; char request[REQUEST], reply[REPLY]; uint32_t ipAddr; int sockfd, n; int One = 1; if (argc !=2) { printf("usage: ttcpcli <IP address or name of server>\n"); exit(0); } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error\n"); exit(0); } memset(&serv, sizeof(serv), 0); serv.sin_family = AF_INET; serv.sin_port = htons(TCP_SERV_PORT); if ((ipAddr = inet_addr(argv[1])) != -1) { serv.sin_addr.s_addr = ipAddr; } else if ((host = gethostbyname(argv[1])) != NULL) { bcopy((char *)host->h_addr, (char *)&serv.sin_addr, host->h_length); } else { printf("unknown host\n"); exit(0); } /* form request */ strcpy(request, "This is a T/TCP payload"); setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, &One, sizeof (One)); if (sendto (sockfd, request, REQUEST, MSG_EOF, (SA)&serv, sizeof(serv)) != REQUEST) { printf("sendto error\n"); exit(0); } if ((n = read_stream(sockfd, reply, REPLY)) < 0) { printf("read error\n"); exit(0); } /* process "n" bytes of reply[] ... */ printf("received:%s\n", reply); exit(0); } SERVER: int read_stream (int fd, char *ptr, int maxbytes) { int nleft, nread; nleft = maxbytes; while (nleft > 0) { if ((nread = read(fd, ptr, nleft)) < 0) return (nread); /* error return < 0 */ else if (nread == 0) break; /* EOF, return #bytes read */ nleft -= nread; ptr += nread; } return (maxbytes - nleft); } int main () { struct sockaddr_in serv, cli; char request[REQUEST], reply[REPLY]; int listenfd, sockfd, n, clilen; if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error\n"); exit(0); } memset(&serv, sizeof(serv), 0); serv.sin_family = AF_INET; serv.sin_port = htons(TCP_SERV_PORT); serv.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(listenfd, (SA)&serv, sizeof(serv)) < 0) { printf("bind error\n"); exit(0); } if (listen(listenfd, SOMAXCONN) < 0) { printf("listen error\n"); exit(0); } for(;;) { clilen = sizeof(cli); if ((sockfd = accept(listenfd, (SA)&cli, &clilen)) < 0) { printf("accept error\n"); exit(0); } if ((n = read_stream(sockfd, request, REQUEST)) < 0) { printf("read error\n"); exit(0); } /* process "n" bytes of request[] and create reply[] ... */ printf("recevied:%s\n", request); strcpy(reply, "Server response"); if (send(sockfd, reply, REPLY, MSG_EOF) != REPLY) { printf("send error\n"); exit(0); } close(sockfd); } } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?JCEDLMKGMLLELHAJNIHJCEBJDGAA.kfl>