From: Michael Hale Date: 2003-12-04T06:34:49+09:00 Subject: c extension troubles on windows Hi ruby extension geeks, and thanks in advance for your help. The short version of the issue that I am struggling with is that I have a native library I created a ruby extension for. The extension works on linux, but on windows it does not. I have copies of the library I am extending for both windows and linux from our vendor (Spirent). I am using gcc on linux and MSVC.NET on windows. Everything compiles and links without complaining. On both windows and linux I am able to successfully execute the method "ETGetLibVersion" which gives me back the library version. I run into trouble on windows when I try to call "ETSocketLink". On linux this call connects and returns as I would expect, however on windows it connects and blocks. For example when I do a printf before and after this call I only get output from the first printf and I have to kill the process to get my cursor back. Is this a problem with the way I am compiling on windows? A problem with Spirent's library? Or some other issue that a non-c programmer like myself would be totally ignorant of. Here is the relevant c and ruby code: Ruby: require "./smartlib.so" include SmartLib p eTGetLibVersion p eTSocketLink("192.168.1.244", 16385) C: #include "ruby.h" #include "et1000.h" static VALUE smartlib_ETSocketLink(VALUE self, VALUE ip, VALUE port) { int c_result; printf("before"); c_result = ETSocketLink(STR2CSTR(ip), NUM2INT(port)); printf("after"); return Qnil; } static VALUE smartlib_ETGetLibVersion() { char pszDescription[50]; char pszVersion[20]; int c_result = ETGetLibVersion(pszDescription, pszVersion); VALUE result = rb_ary_new(); rb_ary_push(result, INT2NUM(c_result)); rb_ary_push(result, rb_str_new2(pszDescription)); rb_ary_push(result, rb_str_new2(pszVersion)); return result; } VALUE cSmartLib; void Init_smartlib(){ cSmartLib=rb_define_module("SmartLib"); rb_define_method(cSmartLib, "eTSocketLink", smartlib_ETSocketLink, 2); rb_define_method(cSmartLib, "eTGetLibVersion", smartlib_ETGetLibVersion, 0); }