Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win


"Accept" - works on some stations, not others

Posted on 2002-06-21
Medium Priority
Last Modified: 2010-04-21
  I have written a little c++ client/server in linux and everything worked fine. But when I moved the source to another machine and compiled it there, the accept call returns a invalid argument error, when I run and try to connect to the server with a connect call from the client.  If I only move the executable to this machine, it works fine.  So it seems there is something going wrong a compile-time.  I use g++ to compile.

I hope someone can help.  Thanks in advance.

Question by:huxun
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Expert Comment

ID: 7100974
another linux machine?
g++ -v to see what versions are you running of both machines.

"the accept call returns a invalid argument error,"
I don't understand, if the accept returns an error that would mean it compiles OK and then compiler is NOT an issue, If the error is compilation or link time? then tell us more, line 1--> other machine and versions of compiler. it would really help if you post the actuall error

Author Comment

ID: 7103311
Hi ... I figured out how to solve this stupid error.  But I don't understand why it occured.  I have the same version of the compiler on all the machines.  The thing was that when I send the socklen_t argument into 'accept' it ran ok if I compiled at the machine I originally wrote the program, but not if I compiled at some other machine.  Still, I could copy the executable file to this other machine from the original and it would run fine.  So I started commenting alot af stuff out and adding it piece by piece, and on the end I found the cause of the error. This:

char c;
socklen_t fromlen;
accept( s, (struct sockaddr *) &fsain, &fromlen);

had to be changed to this:

socklen_t fromlen;
char c;
accept( s, (struct sockaddr *) &fsain, &fromlen);

I do not understand why this is the case and if someone has a clue, please tell me.

Expert Comment

ID: 7105910

Without seeing the remainder of your code its hard to offer an opinion. However based on bitter experience I find that in cases where swapping the order of variable declarations "fixes" problems then the real problem lies with the variable being partially over-written by another variable. I think you will find that the second piece of code works because the variable c is not used prior to fromlen being used and the value being loaded into fromlen is longer than socklen_t for some reason. In the first case part or all of fromlen is being over-written by another variable.

I would need to see more of your code to go any further, perhaps you could post the include statements, the variable declarations (if any) after the two you have posted, the code that initialises fromlen (and the declaration of any variables used in this process).

Perhaps you could revert to the original code, compile it on the offending system (with debug) then run it through the debugger watching fromlen at each step to detect the location where this variable gets corrupted.

Cheers - Gavin
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!


Expert Comment

ID: 7119122
sound like a logical explanation newmang.

Author Comment

ID: 7121455
I wrote out the size and location of the variables and they didn't overlap.  Still, do not understand what was going wrong. Guess the compiler is kaput.  It is version 2.96 so ...

Accepted Solution

pjb1008 earned 400 total points
ID: 7249077
The fromlen parameter is input and output.
On entry to accept(), it is the size of the address buffer;
on exit it is the size of the address.

Typical usage is:

struct sockaddr_in addr;
sockaddr_t len=sizeof(addr);

retval=accept(fd, (struct sockaddr *)&addr, &len);

Chances are that len wasn't initialised, and you picked up whatever value happened to be on the stack. This will yield different results with different compilers.
LVL 20

Expert Comment

ID: 9925511
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Accept: pjb1008 {http:#7249077}

Please leave any comments here within the next seven days.

EE Cleanup Volunteer

Featured Post

Tech or Treat!

Submit an article about your scariest tech experience—and the solution—and you’ll be automatically entered to win one of 4 fantastic tech gadgets.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you ever been frustrated by having to click seven times in order to retrieve a small bit of information from the web, always the same seven clicks, scrolling down and down until you reach your target? When you know the benefits of the command l…
The purpose of this article is to fix the unknown display problem in Linux Mint operating system. After installing the OS if you see Display monitor is not recognized then we can install "MESA" utilities to fix this problem or we can install additio…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
In a question here at Experts Exchange (https://www.experts-exchange.com/questions/29062564/Adobe-acrobat-reader-DC.html), a member asked how to create a signature in Adobe Acrobat Reader DC (the free Reader product, not the paid, full Acrobat produ…
Suggested Courses

618 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question