通过TCP Socket进行通信的单向方式

时间:2018-01-23 09:07:58

标签: python c linux sockets tcp

我正在尝试通过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;
}

2 个答案:

答案 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函数。