Как исправить «ошибку подключения Winsock», когда код ошибки не указан в C ++ - PullRequest
0 голосов
/ 11 июля 2019

Я создал две программы с Winsock, серверную программу и клиентскую программу. Когда я выполняю их на моем компьютере с Windows (в разных окнах cmd), я могу получить сообщение от клиента. Когда я пытаюсь запустить клиент на другом компьютере, я получаю сообщение о том, что сокет был успешно создан, но сообщение не отправляется. Вместо этого сервер просто продолжает слушать, пока клиент больше не отвечает. Нет кода ошибки (даже не истекло время ожидания или что-то в этом роде).

Я пытался изменить номер порта (с какого-то случайного порта на порт 80), но это не помогло. Я также выключил брандмауэр на стороне сервера и на стороне клиента, но это тоже не помогло.

Мой код для клиента:

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

int startWinsock(void);

int main()
{
    long rc;
    SOCKET s;
    char buf[250] = "HELLO";
    SOCKADDR_IN addr;
    rc=startWinsock();


    if(rc!=0){
        printf("Error: startWinsock, error code: %d\n",rc);
    return 1;
    }
    else{
        printf("Winsock started!\n");
    }

    s=socket(AF_INET,SOCK_STREAM,0);

    if(s==INVALID_SOCKET){
        printf("Error: Could not create Socket: %d\n",WSAGetLastError());
        return 1;
    }

    else{
        printf("Socket created!\n");
    }

    memset(&addr,0,sizeof(SOCKADDR_IN)); // initialise to 0 
    addr.sin_family=AF_INET;
    addr.sin_port=htons(80); 
    addr.sin_addr.s_addr=inet_addr("myip"); // address is the IP adress of the PC where the server program runs

    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    if(rc==SOCKET_ERROR){
        printf("Error: could not connect: %d\n",WSAGetLastError());
        return 1;
    }
    else{
        printf("conected");
    }


        rc=send(s,buf,strlen(buf),0);




    }


    buf[rc]='\0';
    closesocket(s);
    WSACleanup();


return 0;
}


int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}

и на стороне сервера:

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

int startWinsock(void);
int main()
{
    long rc;
    char buf[250];
    SOCKET acceptSocket;
    SOCKET connectedSocket;
    SOCKADDR_IN addr;
    rc=startWinsock();

    if(rc!=0){
        printf("Error startWinsock: %d\n",rc);
        return 1;
    }
    else
    {
        printf("Winsock started!\n");
    }
    acceptSocket=socket(AF_INET,SOCK_STREAM,0);

    if(acceptSocket==INVALID_SOCKET){
        printf("Error: Could not create Socket: %d\n",WSAGetLastError());
        return 1;
    }
    else{
        printf("Socket created!\n");
    }

    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(80);
    addr.sin_addr.s_addr=ADDR_ANY;
    rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));

    if(rc==SOCKET_ERROR){
        printf("Error: bind: %d\n",WSAGetLastError());
        return 1;
    }

    else{
        printf("Socket binded to port 80\n");
    }

    rc=listen(acceptSocket,10);

    if(rc!=0){
        printf("Error: listen: %d\n",WSAGetLastError());
        return 1;
    }
    else{
        printf("acceptSocket in listen mode....\n"); 
    }

    connectedSocket=accept(acceptSocket,NULL,NULL);

    if(connectedSocket==INVALID_SOCKET){
        printf("Error: accept: %d\n",WSAGetLastError());
        return 1;
    }
    else{
        printf("New connection accepted!\n");
    }
    rc=recv(connectedSocket,buf,250,0);

    buf[rc]='\0';
    printf("Client sendet: %s\n",&buf);
    closesocket(acceptSocket);
    closesocket(connectedSocket);
    WSACleanup();




return 0;
}

int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}
...