如何在Python客户端和C ++服务器上使用套接字

Dou*_*gui 5 c++ python sockets

我有一个简单的客户端/服务器程序。

客户端是这样用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)
Run Code Online (Sandbox Code Playgroud)

我用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)
Run Code Online (Sandbox Code Playgroud)

我想创建服务器的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;
}
Run Code Online (Sandbox Code Playgroud)

它可以工作一次,但会阻塞str(s.recv(1000))客户端。

这是客户端的输出:

Step 1
Step 2
b'test'
0
Step 1
Step 2
Run Code Online (Sandbox Code Playgroud)

这是服务器的输出:

code  5
Server received:  Hello
code  4
code  5
Server received:  Hello
code  4
Run Code Online (Sandbox Code Playgroud)

如您所见,通信是这样的:

  1. 客户端发送消息
  2. 服务器收到消息
  3. 服务器发送消息
  4. 客户端再发送一条消息
  5. 服务器收到一条消息,似乎发送了另一条消息,但客户端未收到。

我怎么了

hyd*_*yde 5

在 C++ 服务器中,您accept连接 , readwrite然后泄漏打开的套接字并等待下一个客户端连接。

将您accept的循环移出,或在接受后添加内循环。

close套接字完成后,在带有套接字编号的变量超出范围之前。