我正在尝试通过TCP套接字从我使用Python设计的GUI向远程Raspberry Pi发送一些数据。我已经实现了一些基本代码。问题是它不会在Python端和Raspberry Pi端出现任何错误,但不知何故,数据永远不会出现在Raspberry Pi端。
以下是我在Python上运行的Python代码的一部分。
self.sendsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sendsocket.connect((TCP_IP, TCP_PORT))
self.sendsocket.send("Hello world!")
self.sendsocket.close()
这是在Raspberry Pi上运行的C代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(void)
{
int sockfd, portno;
socklen_t clilen;
char buffer[1024];
struct sockaddr_in serv_addr, cli_addr;
int n;
portno = 5005;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
bzero(buffer,1024);
n = read(newsockfd,buffer,1024);
if (n < 0) error("ERROR reading from socket");
close(sockfd);
return 0;
}
答案 0 :(得分:2)
在您的Ras-pi方面,您正在阅读public class OutlineManager
{
private DTE dte;
public OutlineManager()
{
dte = Package.GetGlobalService(typeof(DTE)) as DTE;
dte.Events.WindowEvents.WindowActivated += OnWindowActivated;
}
private void OnWindowActivated(Window gotFocus, Window lostFocus)
{
//This is run when a new "window"(panel) gains focus (not only the code window though)
}
}
,但您既没有声明也没有初始化它。此外,您只是newsockfd
- 插入套接字,但从不accept
- 建立连接。
你需要添加这个 -
listen
在致电socklen_t length = 0;
int newsockfd = accept(socket, NULL, &length);
之前。
此外,正如评论中read
所述,您需要在阅读后使用 -
@sjsam
重构代码并将连接处理移动到单独的函数(或线程)也是一件好事,这样您的服务器就可以接受更多连接。但如果这只是一个MCVE,那就没关系。
答案 1 :(得分:0)
您必须在newsockfd
之前初始化变量read
(并声明它?),并且您需要一个socklen_t
类型的变量
类似的东西:
socklen_t addr_size = sizeof cli_addr;
newsockfd = accept(sockfd,&cli_addr,&addr_size);
然后使用read函数。