Как использовать сокет с клиентом 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
Как видите, общение таково:
- Клиент отправляет сообщение
- Сервер получает сообщение
- Сервер отправляет сообщение
- Клиент отправляет другое сообщение
- Сервер получает сообщение и, кажется, отправляет другое сообщение, но клиент не получил его.
В чем моя ошибка?
2 ответа
На сервере C++ вы accept
соединение, read
, write
, затем утечка открытого сокета и перейти к ожиданию подключения следующего клиента.
Переместить ваш accept
вне цикла или добавить внутренний цикл после принятия.
А также close
сокет, когда вы закончите с ним, прежде чем переменная с номером сокета выйдет из области видимости.
Одна вещь, которая кажется странной, состоит в том, что в версии C у вас есть принятие внутри цикла.
Я думаю, это означает, что на каждой итерации он будет пытаться установить новое соединение с сокетом для нового клиента.