我在C中编写了一个连接到端口5678
的TCP套接字。它应该从C语言传输一个字符串到用Python编写的TCP客户端。
这是用C:
编写的服务器循环for(;;) {
bzero(buffer, 256);
// Socket read functions
n = read(clientsockfd, buffer, 255);
if (n == 0) {
printf("[Socket]: Client disconnected\n");
break;
}
if (n < 0) {
error("[Socket]: Error: Cannot read from socket\n");
}
// Socket write functions
printf("[Socket]: Sent: %s\n", "Some message!");
n = write(clientsockfd, "Some message!", 0);
if (n < 0) {
error("[Socket]: Error: Cannot write to socket\n");
}
}
我的Python客户端连接到TCP套接字:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 5678))
except socket.error: # Connection refused error
logging.critical("Could not connect to the socket!")
然后客户端进入无限循环请求数据,接收数据和打印数据:
while True:
sock.send(str(0).encode('utf-8'))
print(sock.recv(1024).decode('utf-8')))
但是Python客户端依赖于recv()
方法。
我想这是C服务器的一个问题,因为我之前有一个用Python编写的服务器,而且客户端运行得很好。
此外,在telnet
中进行调试时,服务器具有预期的行为:
telnet localhost 5678
对此问题的任何帮助将不胜感激!谢谢!
答案 0 :(得分:2)
n = write(clientsockfd, "Some message!", 0);
写入零字节数据。
答案 1 :(得分:2)
但是Python客户端依赖于recv()方法。
这是因为套接字阻塞,您无法从服务器接收任何内容。
服务器没有任何内容,因为:
write(clientsockfd, "Some message!", 0);
您要求将零字节写入套接字。
write
原型是:
ssize_t write(int fd, const void *buf, size_t count);
write()从缓冲区指针count
写入buf
个字节到fd
。