请问哪里有tcptrace的源码?能够响应多线程的。

解决方案 »

  1.   

    程序调试老是接受数据出错,请高手帮看看哪里问题:
    #include <Winsock2.h>
    #include <stdio.h>
    #pragma comment(lib, "ws2_32.lib")
    #include <windows.h>
    DWORD WINAPI Fun1Proc(
      LPVOID lpParameter   // thread data
      );DWORD WINAPI Fun2Proc(
      LPVOID lpParameter   // thread data
      );SOCKET sockSrv;
    SOCKET sockConn;
    SOCKADDR_IN addrSrv;SOCKET sockClient;SOCKADDR_IN addrSrv2;SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    void main()
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1);

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    return;
    }


    if ( LOBYTE( wsaData.wVersion ) != 1 ||
            HIBYTE( wsaData.wVersion ) != 1 ) {
    WSACleanup( );
    return; 
    } sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    sockClient = socket(AF_INET, SOCK_STREAM, 0);

    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);

    addrSrv2.sin_addr.S_un.S_addr=inet_addr("202.108.23.82"); //"211.154.205.43"
    addrSrv2.sin_family=AF_INET;
    addrSrv2.sin_port=htons(80);

    if(SOCKET_ERROR == bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
    {
    printf("Error bind, Reason: %d!\n", WSAGetLastError());
    return;
    }

    listen(sockSrv,5);

    SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
    connect(sockClient,(SOCKADDR*)&addrSrv2,sizeof(SOCKADDR));    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,(LPVOID)sockConn,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,(LPVOID)sockConn,0,NULL);
    if(getchar()=='Q')
    {
    printf("exit the program");
    closesocket(sockClient);
    closesocket(sockConn);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    WSACleanup( );
    return; 
    }
    printf("444444444444444444444444444");
    }
    DWORD WINAPI Fun1Proc(
      LPVOID lpParameter   // thread data
      )
    {

    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1);

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    return 0;
    }
    SOCKET conn = (SOCKET)lpParameter;
    // printf("1111111111111111111111111\n");
    // 一旦客户端链接后,立刻与服务器建立链接
    // 等待客户端链接
    // printf("3333333333333333333333333333333"); char recvBuf[1000];

    while(TRUE)
    {   



    // printf("9999999999999999999");


    int recvbytes = recv(conn, recvBuf, sizeof(recvBuf), 0);
    if(recvbytes == -1)
    {
    printf("Recv error, %d\n", WSAGetLastError());
    continue;
    }
    // recvBuf[recvbytes] = 0;
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
    printf("Recv %d bytes\n", recvbytes);
    printf("%s\n", recvBuf);

    send(sockClient, recvBuf, recvbytes, 0);

    }
       return 0;
       
    }DWORD WINAPI Fun2Proc(
      LPVOID lpParameter   // thread data
      )
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1);

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    return 0;
    }
    SOCKET conn = (SOCKET)lpParameter;

    char CrecvBuf[2000];

    while(true)
    {
    int  recvbytes = recv(sockClient, CrecvBuf, sizeof(CrecvBuf),0);
    // CrecvBuf[recvbytes] = 0;
    printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
    printf("Recved %d bytes from http server\n",recvbytes);//recvBuf);
    printf("%s",CrecvBuf);
    send(conn,CrecvBuf, recvbytes,0);
    }
    return 0;
    }
      

  2.   

    WSAGetLastError看看返回什么错误