我尝试了如下的方法,可是当我send的时候仍然返回错误10038
这是为什么呢??郁闷啊~~希望两位能帮帮我。。多谢拉~~~~
我的email: mysqls@sina.com-------------------------------------------------------
回复人: verybigbug() ( ) 信誉:100  2003-1-20 10:06:04  得分:20 
  
不可以简单的将socket的值利用。应该通过DuplicateHandle进行。进程1:
  WSAStartup();
  s1 = socket();
  connect();进程2:
  WSAStartup();
  hh = OpenProcess(p1Id);
  DuplicateHandle(hh, s1, -1, &s2, PROCESS_ALL_ACCESS, FALSE, DUPLICATE_SAME_ACCESS);
  connect(s2);
  ...注意:
  进程2中的s1和p1Id为进程1中的s1值和进程1的进程ID.

解决方案 »

  1.   

    我的代码如下:------------------------------------------------
      WSADATA wsaData;
      DWORD dwProcessID;  WSAStartup(MAKEWORD(1, 1), &wsaData);
      HWND hWnd = FindWindow("TCliForm", "CliForm");
      DWORD dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessID);
      HANDLE hh = OpenProcess(PROCESS_DUP_HANDLE, true, dwProcessID);  DWORD s1 = GetSocket();
      //GetSocket是我在hook api的dll中写的一个函数,返回需要共享的socket
      DuplicateHandle(hh, (HANDLE)s1, (HANDLE)(-1), (LPHANDLE)(&g_socket), PROCESS_ALL_ACCESS, false, DUPLICATE_SAME_ACCESS);
      CloseHandle(hh);
      

  2.   

    好像你的A进程不是你自己写的,你不能保证A进程有没有connect,
    或者在你B进程send之前A进程中的socket已经closesocket了。
    这样在B进程中复制的socket就没有建立连接,就不会send成功了。
      

  3.   

    我自己写了个进程A进行测试,在进程A连接好,还没断开的时候复制socket,仍然一样的错误……
      

  4.   

    对了。。我在同一个进程中复制socket都不可以
      

  5.   

    不可能吧,除非server就没有响应。也就是说一开始connect就没有成功。
      

  6.   

    不会吧,你看看这些代码。 WSADATA ws; WSAStartup(MAKEWORD(1, 1), &ws);
    SOCKET s, s1;
    int rc; sockaddr_in sd; s1 = socket(AF_INET, SOCK_STREAM, 0);
    sd.sin_port = htons(80);
    sd.sin_family = 2;

    sd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    rc = connect(s1, (const sockaddr*)&sd, sizeof(sd)); HANDLE hh = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
    DuplicateHandle(hh, (HANDLE)s1, GetCurrentProcess(), (LPHANDLE)&s, PROCESS_ALL_ACCESS, FALSE, DUPLICATE_SAME_ACCESS);
    rc = send(s, "adshf", 4, 0);看一下每个rc的值是不是对的。