如题,我用的是Winsock组件编写TCP/IP程序,在客户端程序中,我想在连接失败的时候,提示失败信息,然后退出程序。我现在的处理方法是在Winsock的Error事件中写如下程序的:
msgbox "与服务器端连接失败!"
unload me但是,经常遇到关闭窗口之后,会出现非法错误,提示不能读取内存,但有的时候又不会提示非法错误,真是奇怪了。

解决方案 »

  1.   

    #include "socket.h"
    #include "skthead.h"
    #include "stdio.h"SOCKETEXPORT int init_socket()
    {
    WSADATA wsdData;
    if(WSAStartup(0x202,&wsdData)!=0)
    {
    WSACleanup();
    return 0;
    }
    if (LOBYTE(wsdData.wVersion)!=2 || HIBYTE(wsdData.wVersion) != 2) 
    {
    WSACleanup();
    return 0;
    }
    return 1;
    }
    SOCKETEXPORT int init_server(char *strip)
    {
    if(strlen(strip)==0)
    return 0;
    strcpy(m_strip,strip);

    return 1;
    }
    SOCKETEXPORT int creat_socket()
    {
    char chInfo[64]; if (gethostname(chInfo, sizeof(chInfo)))
    return 0; sock = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sock==INVALID_SOCKET)
    return 0;

    return 1;
    }
    SOCKETEXPORT int conn_socket()
    {
    sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_addr.s_addr=inet_addr(m_strip);
    local.sin_port=htons(PORT);

    if(connect(sock,(sockaddr *)&local,sizeof(local))!=0)
    {
    WSACleanup();
    return 0;
    }
    return 1;
    }
    SOCKETEXPORT int bind_socket()
    {
    sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_addr.s_addr=INADDR_ANY;
    local.sin_port=htons(PORT);

    if(bind(sock,(sockaddr *)&local,sizeof(local))!=0)
    {
    WSACleanup();
    return 0;
    }
    return 1;
    }
    SOCKETEXPORT int read_socket(SOCKET m_ReadSock,struct databuf &buf_data)
    {
    recv(m_ReadSock,buf_data.strcd,3,0);
    recv(m_ReadSock,buf_data.size,4,0); int size=atoi(buf_data.size);
    if(buf_data.buf!=NULL)
    delete buf_data.buf; 
    buf_data.buf=new char [size+1]; int recvlen=recv(m_ReadSock,buf_data.buf,size,0); if(recvlen!=size)
    return 0;
    return 1;
    }
    SOCKETEXPORT int send_socket(struct databuf buf_data)
    {
    char *buf;
    int size=atoi(buf_data.size)+7;
    buf=new char[size];
    strcpy(buf,buf_data.strcd);
    strcat(buf,buf_data.size);
    strcat(buf,buf_data.buf);
    int sendlen=send (sock,buf,strlen(buf),0);
    int sendsize=strlen(buf);
    delete buf;
    if(sendlen!=sendsize)
    return 0;
    if(sendlen==0)
    return 0;
    return 1;
    }
    SOCKETEXPORT int accept_socket(SOCKET &m_ReadSock)
    {
    sockaddr_in from;
    SOCKET m_socket=NULL;
    int fromlen=sizeof(from);
    m_ReadSock=accept(sock,(struct sockaddr*)&from,&fromlen);
    if(m_ReadSock==INVALID_SOCKET)
    return 0;
        return 1;
    }
    SOCKETEXPORT void close_socket()
    {
    closesocket(sock);
    }
    SOCKETEXPORT int listen_socket()
    {
    if(listen(sock,5)!=0)
    {
    WSACleanup(); 
    return 0;
    }
    return 1;
    }
    改VB成DLL或我直接发给你DLL,我的使用末问题.