This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]