[Openmcl-devel] wx86cl-Windows XP SP3 32bit-socket error #22 during write

Raymond Wiker rwiker at gmail.com
Fri Apr 17 11:06:13 PDT 2009

On Apr 17, 2009, at 08:44 , Gary Byers wrote:

> On Thu, 16 Apr 2009, John Miller wrote:
>> On Apr 15, 2009, at 2:36 PM, Gary Byers wrote:
>>> On Wed, 15 Apr 2009, John Miller wrote:
>>>> I am running CCL 1.3-r1195 (WindowsX8632) and getting the below
>>>> "(error #22) during write" when trying to connect to the Xming
>>>> server (or is that client? never could get that straight) on my
>>>> Windows XP, SP 3 machine.  I also get the same error when I try to
>>>> connect to swank from Emacs using slime.
>>>> I have another Windows XP machine that runs as a virtual machine
>>>> under parallels and I do not have any problems running slime+swank
>>>> on ccl on that machine (haven't tried clx, though).  I am stymied-
>>>> which is admittedly a pretty easy thing to do- but I was wondering
>>>> if anyone could provide insight into what an "(error #22) during
>>>> write" means.
>>> It means "The device doesn't recognize the command."  (I suppose  
>>> that
>>> you'll want to know what that means now. I don't know yet.)
>>> On the machine that has problems, does networking generally work ?
>>> E.g., is some network interface configured ? One would think that
>>> that wouldn't matter much, since you're just trying to connect to
>>> the loopback address, but this is Windows ...
>> I also should add that I rebooted my Win machine in diagnostic  
>> mode, which
>> disables all the cruft my employer has placed on this machine, and  
>> I still
>> get the socket error.  I installed SBCL 1.0.22 and it runs the  
>> slime/swank
>> combo just fine.  Not sure what else I can check, and I believe I  
>> am the only
>> unfortunate slob in the CCL universe with this problem, so I have a  
>> feeling
>> this one is going to remain a mystery.
>> Thanks anyway...
> Confusingly, there are a couple of different sets of error numbers
> that can be relevant under Windows:
>  - some functions return (perhaps indirectly, by setting the "errno"
>    thread-local variable) a POSIX error number to indicate an error.
>  - many functions return (in another thread-local variable that can
>    be accessed via #_GetLastError) a Windows error code.
> The actual numbers can conflict, but conflicting POSIX and Windows
> error numbers generally have nothing to do with each other.
> In the case where you get an "error 22" during FD-STREAM-FORCE-OUTPUT,
> we're interpreting the "22" as a Windows error number:
> ? (ccl::%windows-error-string 22)
> "The device does not recognize the command. "
> but the function that failed actually returns a POSIX error number:
> ? (ccl::%strerror 22)
> "Invalid argument"
> I don't know which of these is more generic and less helpful, but
> I actually think that the POSIX interpretation may be very slightly
> helpful.  The function that generates the error is a call to WriteFile
> in the function lisp_write (in ccl/lisp-kernel/windows-calls.c):
>   if (WriteFile(hfile, buf, count, &nwritten, &overlapped)) {
>     return nwritten;
>   }
>   err = GetLastError();
>   _dosmaperr(err);         /* map Windows error to POSIX error, set  
> errno */
>   return -1;
> So, the call to WriteFile is returning a Windows error number that  
> gets
> mapped to EINVAL (=22).  If you look at the function _dosmaperr (in  
> that
> same C source file), you'll see that a small number of Windows errors
> are mapped to specific POSIX errors and anything not enumerated gets
> mapped to EINVAL: we don't know with any confidence what WriteFile was
> really complaining about.

I seem to recall that Windows, unlike Unix and Unix-a-likes, does not  
allow read()/write() to be used on both file descriptors and socket  
descriptors; for the latter, recv()/send() should be used. "Invalid  
argument" may well be the error code I got when I got hit by this, a  
good few years back.

Not sure if this is relevant, as you seem to be using Win32 calls, and  
not Posix ones - but then again, you do refer to  Posix error codes :-)

The variation in behaviour on using Slime might be due to Slime  
version / communication setup...

More information about the Openmcl-devel mailing list