2016-06-27 4 views
1

У меня есть сервер сокета python, который отправляет строки программе C (клиенту), которая печатает строку, а затем отправляет ее обратно в программу python, которая также печатает. Коммуникация работает, но если она отправляет длинную строку, то короткую, текущую и предыдущую данные рода слияния. Вот пример:Связь сокета между кодом C и python

Выход:

5.0standing0.0    //That is how it should look like 
5.0walk0ing0.055111512313e-17 //After the long string 

питон код (только вызывается в цикле):

import socket 
import sys 

# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# Bind the socket to the port 
server_address = ('localhost', 8888) 
print >>sys.stderr, '\nstarting up on %s port %s\n' % server_address 
sock.bind(server_address) 

# Listen for incoming connection 
sock.listen(1) 

def send_control(state,xdiff,xactual): 
    connection, client_address = sock.accept() 
    connection.sendall(str(xactual)+str(state)+str(xdiff)) 
    data = connection.recv(2000) 
    print data 
    data = '\0' 

C код (вызывается в цикле тоже):

void comm_func() 
{ 
    int sock; 
    int i=0; 
    struct sockaddr_in server; 
    char message[1024] , server_reply[2000]; 

    //Create socket 
    sock = socket(AF_INET , SOCK_STREAM , 0); 
    if (sock == -1) 
    { 
     printf("Could not create socket"); 
    } 
    // puts("Socket created"); 

    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(8888); 

    //Connect to remote server 
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     perror("connect failed. Error"); 
    } 

    // Receive a reply from the server 
    if(recv(sock , server_reply , 2000 , 0) < 0) 
    { 
     puts("recv failed"); 
    } 
    puts(server_reply); 
    write(sock,server_reply,50); 
    for (i=0; i< strlen(server_reply); i++) 
    { 
    server_reply[i] = '\0'; 
    } 
    close(sock); 
} 

Может кто-нибудь мне помочь?

+2

Полученная строка не завершена нулем, поэтому [UB] (https://en.wikipedia.org/wiki/Undefined_behavior). Легко исправить 'char server_reply [2000] = {0}' – LPs

+2

Никогда не ожидайте, что 'recv()' вернет столько, сколько ему было сказано. Проверьте его возвращаемое значение, когда-либо. Также проверьте его на '0'. Также учтите, что TCP ориентирован на поток. N отправлений может вызвать M прием, с N> M или N alk

+0

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

ответ

1

Изменение

// Receive a reply from the server 
    if(recv(sock , server_reply , 2000 , 0) < 0) 
    { 
     puts("recv failed"); 
    } 

В:

ssize_t len; 
    // Receive a reply from the server 
    if((len = recv(sock , server_reply , 2000 , 0)) < 0) 
    { 
     puts("recv failed"); 
     close(sock); 
     return -1; 
    } 
    server_reply[len] = 0; 

Как как @LP и @ack упоминания в комментариях, проблема в том, что короткое сообщение не завершенную нулем, который является нормальным где 0 - действительный байт для отправки.

Смежные вопросы