python3和c通过套接字相互传输数据

时间:2016-04-13 02:16:29

标签: c sockets python-3.x

我想通过Python3套接字向C发送一些控制信号。我编写了一个测试用例代码进行通信。令我困惑的是server.c无法从python3接收信号,而python无法正确显示C中的数据。 server.c代码是:

int main(){
        int serv_sock = socket(AF_INET,SOCK_STREAM,0);
        int clnt_sock;
        struct sockaddr_in serv_addr;
        memset(&serv_addr,0,sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
        serv_addr.sin_port = htons(1234);
        bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

        listen(serv_sock,1024);
        int  str[] = {1,2,5,6};
        char buffer[50];

        while(1){
                clnt_sock = accept(serv_sock,NULL,NULL);
                while(1){
                        send(clnt_sock,str,4*sizeof(int),0);
                        recv(clnt_sock,buffer,50,0);
                        printf("%s",buffer);
                }
                close(clnt_sock);
        }
        close(serv_sock);
        return 0;
}

,client.py代码为:

import socket
import struct
host = "127.0.0.1"
port = 1234
sock = socket.socket()
sock.connect((host,port))
message = input("->")
while True:
        sock.send(message.encode())
        data = sock.recv(1024)
        if not len(data):
                break
        for i in list(struct.unpack('iiii',data.decode())):
                print(i)
        message = input("->")
close(sock)

以前有人见过这样的问题吗?希望得到你的帮助。

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题,但是,它基本上是正确的。

客户端不显示来自服务器的数据,因为struct.unpack()失败。 recv()返回的值为bytes,因此您无需将其解码为unicode,然后再将其传递给期望struct.unpack()的{​​{1}}(或任何遵守的内容)缓冲区接口,Python 3 bytes没有。)

服务器确实从客户端接收数据,但由于缓冲而未显示。解决这个问题的一种方法是让服务器在消息后打印一个新行:

str

或者客户端可以为每条消息添加一个新行:

printf("%s\n",buffer);

或者您可以在sock.send((message + '\n').encode()) 之后在服务器中添加fflush(stdout)

服务器中的缓冲区存在问题,其中部分早期消息可能出现在后续消息中 - 您需要清除每个printf("%s",buffer);之间的缓冲区。添加

recv()
memset(buffer, 0, sizeof(buffer)); 解决之前

最后,客户端应该recv()而不是sock.close()