【发布时间】:2016-10-29 16:50:36
【问题描述】:
我有一个 python 套接字服务器,它将字符串发送到打印字符串的 C 程序(客户端),然后将其发送回也打印它的 python 程序。通信有效,但如果它发送一个长字符串,那么一个短字符串,当前和以前的数据有点合并。示例如下:
输出:
5.0standing0.0 //That is how it should look like
5.0walk0ing0.055111512313e-17 //After the long string
python 代码(只是在循环中调用):
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);
}
谁能帮帮我?
【问题讨论】:
-
接收到的字符串不是以null结尾的,所以UB。轻松修复
char server_reply[2000] = {0} -
永远不要期望
recv()会像被告知的那样返回。检查它的返回值,永远。同时测试0。还要考虑到 TCP 是面向流的。 N 次发送可能会触发 M 次接收,N>M 或 N -
投票关闭此作为对文档的隐式调用,这似乎并不存在。
-
最简单的方法是不使用原始套接字,而是使用 ZeroMQ 等快速安全的消息库。
-
@Taywee 学习经验,我想。我无法想象有人真正需要问题中的场景来进行任何真实