簡體   English   中英

Windows下的C套接字編程

[英]C socket programming under windows

嗨,我是套接字編程的新手,我正在嘗試http://www.binarytides.com/winsock-socket-programming-tutorial/的教程中的以下代碼

我正在嘗試連接到服務器,並且正在使用google的IP地址。 這是代碼:

#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc , char *argv[])
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }

    printf("Socket created.\n");


    server.sin_addr.s_addr = inet_addr("74.125.224.72");
    server.sin_family = AF_INET;
    server.sin_port = htons(80);

    //Connect to remote server
    if (connect(s, (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected");

    return 0;
}

到目前為止,可以創建套接字,但是我無法連接到服務器。 更具體地說,我總是退出並具有以下內容:

程序“ [2060] SocketCTest.exe:本機”已退出,代碼為1(0x1)。

即使我在返回前設置了斷點。

沒有錯 我已經在計算機上嘗試過,並且連接返回錯誤( WSAETIMEDOUT )。 我不確定計算機,代理服務器,防火牆等上是否有網絡設置; 或該Google主機配置為不接受直接套接字連接。

無論如何,這是您的代碼,進行了一些小的調整:

#include <stdio.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") //Winsock Library

int main(int argc, char *argv[])
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char c = 0;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d.\nPress a key to exit...", WSAGetLastError());
        c = getch();
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d.\n", WSAGetLastError());
        WSACleanup();
        c = getch();
        return 1;
    }
    printf("Socket created. Connecting...\n");
    memset(&server, 0, sizeof server);
    server.sin_addr.s_addr = inet_addr("74.125.224.72");
    server.sin_family = AF_INET;
    server.sin_port = htons(80);

    //Connect to remote server
    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        printf("Connect error:%d.\nPress a key to exit...", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        c = getch();
        return 1;
    }
    puts("Connected.\nPress a key to exit...");
    closesocket(s);
    WSACleanup();
    c = getch();
    return 0;
}

現在,如果您想查看實際連接的代碼,建議您使用localhost127.0.0.1 )而不是74.125.224.72和端口3389 (例如,如果配置了RDP且是遠程桌面服務器(RDP)端口,在您的計算機上運行)而不是80 如果您的計算機上運行的是Web服務器( IIS ?),則可以設置為80

要獲取在計算機上運行的服務器程序的列表,請運行以下命令:

`netstat -an | findstr LISTEN`

它將以這種形式輸出一堆線(以及我們關心的線)(這是與上面的RDP示例相對應的線):

`TCP    127.0.0.1:3389         0.0.0.0:0              LISTENING`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM