我想通过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)
以前有人见过这样的问题吗?希望得到你的帮助。
答案 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()
。