This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Problem with accept() on i386 pc.
- From: "Patrick O'Grady" <patrick at baymotion dot com>
- To: <ecos-discuss at ecos dot sourceware dot org>
- Date: Thu, 20 Apr 2006 15:30:46 -0700
- Subject: [ECOS] Problem with accept() on i386 pc.
Hi, all--
Curious if anyone else has seen this problem, or if I'm just doing something
wrong. If I compile the following program on cygwin, then it works as
expected: I can 'telnet localhost 7227' and see my server there. However,
if I compile this program and run it on my i386 pc with an i82559 ethernet
adapter, it doesn't work. My target system is at IP address 10.4.0.73, and
I can ping that with no problems. But if I 'telnet 10.4.0.73 7227', I get
response SYN response packets with RST--implying that the port isn't
listening. My target is configured using 'ecosconfig new pc net' with eCos
from CVS as of today (4/20). I've not tried this program on eCos before;
but if I undefine ECOS_MODE, then it compiles and works under Cygwin as
expected. Thanks for your input!
-patrick
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ECOS_MODE
#ifdef ECOS_MODE
#include <network.h>
#endif
#define assert(c) \
if (c) { } else { printf("Assert failed: \"%s\".\n", #c); exit(1); }
int main(void)
{
int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
printf("Starting.\n") ;
#ifdef ECOS_MODE
init_all_network_interfaces() ;
#endif
sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd >= 0);
printf("sockfd=%d.\n", sockfd) ;
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 7227 ;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
int r = bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
;
printf("bind returned %d.\n", r) ;
assert(r >= 0) ;
r = listen(sockfd, 5);
printf("listen returned %d.\n", r) ;
while (1)
{
printf("Ready on port %d.\n", portno) ;
clilen = sizeof(cli_addr);
bzero((char *) &cli_addr, sizeof(cli_addr));
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
printf("Accept newsockfd=%d.\n", newsockfd) ;
assert(newsockfd >= 0) ;
bzero(buffer,256);
n = read(newsockfd,buffer,255);
printf("Read %d bytes.\n", n);
assert(n >= 0) ;
printf("Received: \"%*.*s\"\n", n, n, buffer);
n = write(newsockfd,"I got your message",18);
printf("Write wrote %d bytes.\n", n) ;
assert(n >= 0) ;
close(newsockfd) ;
}
return 0;
}
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss