<![CDATA[Latest posts for the topic "Recv bị đứng khi lập trình Winsock"]]> /hvaonline/posts/list/31.html JForum - http://www.jforum.net Recv bị đứng khi lập trình Winsock Code:
#include <stdio.h>
#include <stdlib.h>
//#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string.h>
//#define MAKEWORD2(L,H) (H<<8)|L


#define ERF_NONE 0
#define ERF_GETHOST 1
#define ERF_CREATESCK 2
#define ERF_CONNECFAIL 3
#define ERF_STARTUPFAIL 4
int main()
{
    SOCKET sckID;
    WSADATA wsaData;
    SOCKADDR_IN sckAddr;
    unsigned int sckPort = 80;
    char *sckHost = "truyen.vnsharing.net";
    HOSTENT *sckHostent;
    int errorFlag = ERF_NONE;

    //Winsock application startup
    if(errorFlag == ERF_NONE)
        if( WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR )
            errorFlag = ERF_STARTUPFAIL;
/**-------------------------------------------------------------------**/
    //Get host by name
    if(errorFlag == ERF_NONE)
        if( (sckHostent = gethostbyname(sckHost)) == NULL )
            errorFlag = ERF_GETHOST;

    //Init data
    if( errorFlag == ERF_NONE ){
        memset(&sckAddr, 0x00, sizeof(SOCKADDR_IN));
        sckAddr.sin_family = AF_INET;
        sckAddr.sin_port = htons(sckPort);
        //sckAddr.sin_addr.s_addr = inet_addr("120.138.69.101");
        sckAddr.sin_addr = *((IN_ADDR*)sckHostent->h_addr);
    }
/**-------------------------------------------------------------------**/
    //Create socket
    if( errorFlag == ERF_NONE)
        if( (sckID = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
           errorFlag = ERF_CREATESCK;

    //Connect now
    if( errorFlag == ERF_NONE )
        if( connect(sckID, (SOCKADDR *)&sckAddr, sizeof(SOCKADDR)) == SOCKET_ERROR )
            errorFlag = ERF_CONNECFAIL;

/**-------------------------------------------------------------------**/

    size_t bzBytes = 0;
    size_t sendBytes = 0;
    size_t rcvBytes = 0;
    char *ptr_sent;
    char *ptr_rcv = malloc(1024);


    char ptr_tmp[1025];
    BOOL csflag = TRUE;


    ptr_sent = "GET / HTTP/1.1\nHost: truyen.vnsharing.net\n\n";

    send(sckID,ptr_sent, strlen(ptr_sent),0 );

    size_t t = 0;

    do{
        memset(ptr_tmp,0x00,1025);
        rcvBytes = recv(sckID, &ptr_tmp, 1024, 0);
        printf("%s",&ptr_tmp);

        if ( rcvBytes > 0 )
            printf("Bytes received: %d\n", rcvBytes);
        else if ( rcvBytes == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    }while( rcvBytes > 0 );
    /*
    while( rcvBytes > 0 || csflag == TRUE ){
        //Clear temp buffer
        csflag = FALSE;
        memset(ptr_tmp,0x00,1025);
        rcvBytes = recv(sckID, &ptr_tmp, 1024, 0);

        if(rcvBytes > 0){

            realloc(ptr_rcv, ( bzBytes + rcvBytes ) );
            //memset( ( ptr_rcv + bzBytes), 0x00, rcvBytes );
            memcpy( ( ptr_rcv + bzBytes) , &ptr_tmp, rcvBytes );
            bzBytes = bzBytes + rcvBytes;
            //printf("%s", &ptr_tmp);

        }* /


        printf("%d\n", bzBytes);
        printf("->%d\n", rcvBytes);


        t++;
        printf("\n%d\n", t);

    }*/

    printf("\nData:\n\n%s", ptr_rcv);
    closesocket(sckID);
    WSACleanup();
    free(ptr_rcv);
    free(ptr_tmp);

    return 0;
}
Chuyện là thế này ! em muốn gửi một binary file (chẳng hạn như quá trình update của soft chẳng hạn, kích thước nó không quá lớn). Khi viết thử mã trên em dbg gặp lỗi ở memcpy(). Em thử lại xem winsock có lỗi gì không. Thì thấy là khi thực thi nó bị đứng, mặc dù em chưa biết nguyên nhân nằm đâu, WSAGetLastError() = 0. rcvBytes nó cũng bình thường, nhưng cái vòng lặp do{}while cứ ở trạng thái idle mãi.]]>
/hvaonline/posts/list/42761.html#265874 /hvaonline/posts/list/42761.html#265874 GMT
Recv bị đứng khi lập trình Winsock Code:
setsockopt(sckID, SOL_SOCKET, SO_RCVTIMEO, (char *)&sckRcvt, sizeof(DWORD));
    setsockopt(sckID, SOL_SOCKET, SO_SNDTIMEO, (char *)&sckSendt, sizeof(DWORD));
Sửa lại đoạn này: Code:
size_t rcvBytes = 0;
Thành: Code:
int rcvBytes = 0;
]]>
/hvaonline/posts/list/42761.html#265975 /hvaonline/posts/list/42761.html#265975 GMT