Клиент C # остановился при соединении с C ++ Server, но отлично работает при соединении с C # Server - PullRequest
0 голосов
/ 09 марта 2019

У меня есть клиентские программы C # и серверные программы C #, которые успешно связаны друг с другом и работают нормально. Но когда я хочу подключить клиент C # к серверу C ++, клиент C # останавливается, а сервер C ++ выдает сообщения об успешном завершении инициализации winsock и успешном создании сокета.

C ++ Код сервера

WSADATA wsaData;

struct sockaddr_in address_of_server;
struct sockaddr_in address_of_client;

int socket_of_client;
int size_of_address_of_client = sizeof(address_of_client);

if (WSAStartup(MAKEWORD(2, 2), &wsaData) == 0) {
    printf("winsock initialization success\n");
}
else {
    printf("winsock initialization failure\n");
}

SOCKET socket_of_server = socket(AF_INET, SOCK_STREAM, 0);

if (socket_of_server == -1) {
    printf("creating socket failure\n");
}
else {
    printf("creating socket success\n");
}

memset(&address_of_server, 0, sizeof(address_of_server));
address_of_server.sin_family = AF_INET;
//address_of_server.sin_family = PF_INET;
address_of_server.sin_addr.s_addr = htonl(INADDR_ANY);
address_of_server.sin_port = htons(8888);

bind(socket_of_server, (struct sockaddr*)&address_of_server, sizeof(address_of_server));

listen(socket_of_server, 5);

ClientSocket = accept(socket_of_server, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
    printf("accept failed with error: %d\n", WSAGetLastError());
    closesocket(socket_of_server);
    WSACleanup();
    return 1;
}

socket_of_client = accept(socket_of_server, (struct sockaddr*)&address_of_client, &size_of_address_of_client);

WSACleanup();

C # Код клиента

public CCRMain()
{
    InitializeComponent();
    clientSocket.Connect("127.0.0.1", 8888);    
}
void Data()
{
    MainWindow mw = (MainWindow)Application.Current.MainWindow;
    NetworkStream serverStream = mw.clientSocket.GetStream();
    byte[] outStream = System.Text.Encoding.ASCII.GetBytes(A1G1.Text + "$");
    serverStream.Write(outStream, 0, outStream.Length);
    serverStream.Flush();

    byte[] inStream = new byte[10025];
    serverStream.Read(inStream, 0, (int)mw.clientSocket.ReceiveBufferSize);

    System.IO.MemoryStream ms = new System.IO.MemoryStream(inStream);
    System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
    int[] inComingData = new int[5];

    for (int i = 0; i < 5; i++)
    {
        inComingData[i] = br.ReadInt32();
        Debug.WriteLine(inComingData[i].ToString());
        A1G1Text.Text = inComingData[0].ToString();
    }
}   

1 Ответ

0 голосов
/ 09 марта 2019

NetworkStream.Read() блокируется.Таким образом, до тех пор, пока сервер не закроет соединение, он не вернется, пока не будет прочитано 10025 байт.

Вы должны непосредственно читать из сетевого потока, а не копировать его дважды (или даже четыре раза в вашем случае: из сети в inStream, затем в MemoryStream, затем в inCommingData и затем в вашу текстовую переменную).

Используйте свойство NetworkStream.ReadTimeout, чтобы указать, что вы хотите, чтобы функция Read () возвращала, даже если в течение некоторого времени не был заполнен весь буфер.

...