2013-12-22 4 views
3

간단한 클라이언트/서버 프로그램이 있습니다.Python 클라이언트와 C++ 서버에서 socket을 사용하는 방법

클라이언트는이 같은 파이썬으로 작성되어

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) 

그리고이 같은 파이썬에서 서버를 썼다 :

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. 을 보낼 수 있습니다.

무엇이 오류입니까?

답변

3

C++에서 서버, 당신은 accept 연결, readwrite오픈 소켓을 누설하고 다음 클라이언트가 연결을 대기로 이동합니다.

accept을 루프 밖으로 이동하거나 accept 후 내부 루프를 추가하십시오.

close 소켓 번호가있는 변수가 범위를 벗어나기 전에 소켓을 완료하면 소켓이 종료됩니다.

1

이상하게 보이는 한 가지 점은 C 버전에서 루프 내부에서 수락된다는 것입니다.

각 반복마다 새 클라이언트에 대한 소켓 연결을 시도한다는 의미입니다.

관련 문제