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)
如您所见,通信是这样的:
我怎么了
在 C++ 服务器中,您accept连接 , read,write然后泄漏打开的套接字并等待下一个客户端连接。
将您accept的循环移出,或在接受后添加内循环。
和close套接字完成后,在带有套接字编号的变量超出范围之前。