Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Cho em hỏi lỗi kết nối trong socket?

  1. #1
    Ngày gia nhập
    10 2008
    Bài viết
    58

    Mặc định Cho em hỏi lỗi kết nối trong socket?

    Em viết 1 đoạn chương trình đơn giản để truyền 1 xâu ký tự giữa 2 host trong mạng LAN nhưng ko hiểu sao lại bị báo lỗi ở hàm connect của client. Nếu chạy cả client và server trên cùng 1 máy với địa chỉ server là IP của máy đó thì lại được.
    client.c:
    Code:
    #include <stdio.h>
    #include <winsock2.h>
    
    int main()
    {
        WSADATA wsaData;
    
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "Ham WSAStartup loi.\n");
        else
        {
            SOCKET s;
    
            s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "Ham socket loi.\n");
            else
            {
                SOCKADDR_IN server;
    
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = inet_addr("192.168.1.33");
                server.sin_port         = htons(5050);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
    
                if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
                    fprintf(stderr, "Ham connect loi.\n");
                else
                {
                    char buffer[100];
                    int n;
    
                    n = recv(s, buffer, sizeof(buffer) - 1, 0);
    
                    if (n != SOCKET_ERROR)
                    {
                        buffer[n] = '\0';
                        printf("%s", buffer);
    
                        send(s, "Au revoir\n", (int)strlen("Au revoir\n"), 0);
                    };
    
                    shutdown(s, SD_SEND);
                }
    
                closesocket(s);
            }
    
            WSACleanup();
        }
    
        return 0;
    }
    server.c:
    Code:
    #include <stdio.h>
    #include <winsock2.h>
    
    int main()
    {
        WSADATA wsaData;
    
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "Ham WSAStartup loi.\n");
        else
        {
            SOCKET s_server;
    
            s_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s_server == INVALID_SOCKET)
                fprintf(stderr, "Ham socket loi.\n");
            else
            {
                SOCKADDR_IN server;
    
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = htonl(INADDR_ANY);
                server.sin_port         = htons(5050);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
    
                if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
                    fprintf(stderr, "Ham bind a loi.\n");
                else
                {
                    if (listen(s_server, 0) == SOCKET_ERROR) /* listen : commencer l'ecoute */
                        fprintf(stderr, "Ham listen loi.\n");
                    else
                    {
                        SOCKET s_client;
                        SOCKADDR_IN client;
                        int csize = sizeof(client);
    
                        s_client = accept(s_server, (SOCKADDR *)&client, &csize);
    
                        if (s_client == INVALID_SOCKET)
                            fprintf(stderr, "Ham accept loi.\n");
                        else
                        {
                            char buffer[100];
                            int n;
    
                            printf("Client %s duoc ket noi !\n", inet_ntoa(client.sin_addr));
    
                            strcpy(buffer, "Bonjour\n");
                            send(s_client, buffer, (int)strlen(buffer), 0);
    
                            n = recv(s_client, buffer, sizeof(buffer) - 1, 0);
    
                            if (n != SOCKET_ERROR)
                            {
                                buffer[n] = '\0';
                                printf("%s", buffer);
                            }
    
                            closesocket(s_client);
                        }
                    }
                }
    
                closesocket(s_server);
            }
    
            WSACleanup();
        }
    
        return 0;
    }
    Các anh có thể giải thích cho em tại sao lại thế ko ạ? Em dùng VMWare để tạo mạng LAN ảo, 2 máy ảo và thực có thể chia sẻ dữ liệu bình thường.
    Cám ơn các anh trước nhé!

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Dùng wsagetlasterror để xem lỗi cụ thể là gì
    Life:\> dir

  3. #3
    Ngày gia nhập
    10 2008
    Bài viết
    58

    error code là 10057:
    Socket is not connected.
    A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset.
    Vậy thì phải làm sao ạ?

  4. #4
    Ngày gia nhập
    10 2008
    Bài viết
    58

    Các anh test thử 2 file này xem hộ em sẽ rõ hơn về các error code:
    Attached Files Attached Files

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Chắc quên đổi ip để kết nối chứ gì, chạy vẫn tốt mà
    Life:\> dir

  6. #6
    Ngày gia nhập
    10 2008
    Bài viết
    58

    Mặc định Cho em hỏi lỗi kết nối trong socket?

    Giờ em mới biết tại sao, hóa ra là firewall nó chặn mấy cái port em dùng.

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Nếu nó chặn port, thì khi cậu chạy win sẽ hiển thị 1 msg box, cậu chọn unblock là xong đúng ko nhỉ ?

  8. #8
    Ngày gia nhập
    10 2008
    Bài viết
    58

    Đúng rồi đấy, tại lúc trước mình cứ keep blocking nên mới ko đc. Hoặc là thiết lập lại firewall, mở port nào đấy cho nó cũng đc.

Các đề tài tương tự

  1. Cách tạo bản tin trong lập trình Socket bằng C#?
    Gửi bởi duongv3 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 14-02-2014, 10:39 AM
  2. Kỹ thuật C socket ( sys/socket.h) và GET (sau khi telnet + tên host)
    Gửi bởi tuanc trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 14
    Bài viết cuối: 22-08-2012, 04:24 PM
  3. Lập trình Socket trong C
    Gửi bởi abent trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 07-05-2012, 07:36 PM
  4. Đồ Án Lập Trình Socket trong VC++?
    Gửi bởi KupoMigawa trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 11
    Bài viết cuối: 20-11-2010, 06:19 PM
  5. Socket trong c++
    Gửi bởi metal_shield trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 15-12-2007, 01:31 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn