【问题标题】:Test receiving from local host for socket programmiong in c under windows测试从本地主机接收在 windows 下的 c 中的套接字编程
【发布时间】:2015-07-10 19:25:56
【问题描述】:

您好,我是套接字编程的新手。我目前正在为客户端(即我的计算机)编写 c 代码,以向本地主机 127.0.0.1 发送一些内容,并查看本地主机是否收到请求并返回任何内容。我已经可以连接到本地主机,但我不知道我使用什么命令来测试我是否可以与本地主机交谈。

#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;
    char *message , server_reply[2000];
    int recv_size;


    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, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d\n", WSAGetLastError());
        return 1;
    }
    printf("Socket created.\n");
    //server.sin_addr.s_addr = 127.0.0.1; 
    //server.sin_addr.s_addr = inet_addr("74.125.224.72"); //google IP address
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); //local host IP
    server.sin_family = AF_INET;
    //server.sin_port = htons(80);//IIS port
    server.sin_port = htons(60441); //local port
    //server.sin_port = 80;

    //Connect to remote server
    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        printf("connect error:%d\n", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        system("pause");
        return 1;
    }
    puts("Connected\n");

    closesocket(s);
    WSACleanup();
    system("pause");
    return 0;
}

【问题讨论】:

  • 您的客户端连接到什么样的服务器?你不能盲目地向它发送命令,而不知道它实际期望什么样的命令,它们使用什么格式等。
  • 它看起来很适合实际上不交流任何东西的东西:(
  • 什么服务器正在监听 127.0.0.1:60441 ?你一定有什么想法吧?
  • 如我所说,到目前为止我只完成了连接。是的,这不是交流原因,这就是我发布这个问题的原因。
  • 再一次,你必须知道你连接到什么样的服务器才能与之通信。如果您只是向它发送随机数据,服务器将要么 1)忽略您,2)断开您的连接,3)等待您发送正确的数据,或者 4)可能完全崩溃。与其连接到某个未知的服务器,不如创建自己的服务器进行测试?

标签: c sockets


【解决方案1】:

一旦建立连接,您可以使用send 向远程服务器发送消息,并使用recv 获得回复。您发送的确切内容和期望接收的内容完全取决于您正在使用的服务。

编辑:

例如,假设您正在与 Web 服务器通信,并且您想要检索主页。你可以这样做:

char request[] = "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n";
size_t bytesSent = send(s, request, strlen(request), 0);
if (bytesSent == -1) {
    printf("Error sending: %d\n", WSAGetLastError());
    return 1;
}

char response[10000];
memset(response, 0, sizeof(response));
size_t bytesRead = recv(s, response, sizeof(response), 0);
if (bytesRead == -1) {
    printf("Error receiving: %d\n", WSAGetLastError());
    return 1;
}

printf("response from web server: %.*s\n", bytesRead, response);

【讨论】:

  • 您好,我正在与本地主机 127.0.0.1 通话。我的问题是我不知道我应该向它发送什么以便我可以接收。我无法将内容发送到 Web 服务器,因为我在公司使用 Intranet。
  • 嗯。您正在尝试使用未知协议将内容发送到具有未知功能的服务器?你有小问题,那么:(
  • OK,如果只是TCP,只能发送一个字节流。发送一些东西,'Hello World!\n'。就是这样,这将满足您的协议。
  • 所以看起来您正在连接到端口 60441 上的某个东西。该端口上正在运行什么。
  • @rmtracy:TCP 只是建立连接的传输。您需要在传输之上建立一个协议来来回建立通信对话。你有传输部分,但现在你需要协议部分,这不是任何人都可以在不知道服务器期望你的客户端使用什么协议的情况下帮助你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2011-10-09
  • 2012-10-25
  • 2011-04-24
相关资源
最近更新 更多