Как использовать сокет с клиентом Python и сервером C++

У меня есть простая программа клиент / сервер.

Клиент написан на Python так:

import socket
import sys

HOST, PORT = "localhost", 50007

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((HOST, PORT))
for x in range(0, 10000):
    print("Step 1")
    s.send(b'Hello')
    print("Step 2")
    print(str(s.recv(1000)))
    print(x)

И я написал сервер на Python, как это:

import socket

HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()

while True:
    data = conn.recv(1024)
    conn.sendall(data)

Я хочу создать C++ версию сервера. Я сделал это:

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>

using namespace std;

#define SERVER_PORT htons(50007)

int main() {

        char buffer[1000];
        int n;

        int serverSock=socket(AF_INET, SOCK_STREAM, 0);

        sockaddr_in serverAddr;
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = SERVER_PORT;
        serverAddr.sin_addr.s_addr = INADDR_ANY;

        /* bind (this socket, local address, address length)
           bind server socket (serverSock) to server address (serverAddr).  
           Necessary so that server can use a specific port */ 
        bind(serverSock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr));

        // wait for a client
        /* listen (this socket, request queue length) */
        listen(serverSock,1);

        while (1 == 1) {
                bzero(buffer, 1000);

                sockaddr_in clientAddr;
                socklen_t sin_size=sizeof(struct sockaddr_in);
                int clientSock=accept(serverSock,(struct sockaddr*)&clientAddr, &sin_size);

                //receive a message from a client
                n = read(clientSock, buffer, 500);
                cout << "Confirmation code  " << n << endl;
                cout << "Server received:  " << buffer << endl;

                strcpy(buffer, "test");
                n = write(clientSock, buffer, strlen(buffer));
                cout << "Confirmation code  " << n << endl;
        }
        return 0;
}

Работает один раз, но блокируется на линии str(s.recv(1000)) клиента.

Это вывод от клиента:

Step 1
Step 2
b'test'
0
Step 1
Step 2

И это вывод с сервера:

code  5
Server received:  Hello
code  4
code  5
Server received:  Hello
code  4

Как видите, общение таково:

  1. Клиент отправляет сообщение
  2. Сервер получает сообщение
  3. Сервер отправляет сообщение
  4. Клиент отправляет другое сообщение
  5. Сервер получает сообщение и, кажется, отправляет другое сообщение, но клиент не получил его.

В чем моя ошибка?

2 ответа

Решение

На сервере C++ вы accept соединение, read, write, затем утечка открытого сокета и перейти к ожиданию подключения следующего клиента.

Переместить ваш accept вне цикла или добавить внутренний цикл после принятия.

А также close сокет, когда вы закончите с ним, прежде чем переменная с номером сокета выйдет из области видимости.

Одна вещь, которая кажется странной, состоит в том, что в версии C у вас есть принятие внутри цикла.

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

Другие вопросы по тегам