Cara mengirim data dari python ke C menggunakan soket (unix)

Saya mencoba membuat soket unix untuk memungkinkan beberapa kode c saya berbicara dengan beberapa kode python saya. Kode C bertindak sebagai soket dan python sebagai klien. Sejauh ini saya telah dapat membuat soket dan menghubungkan klien ke sana, tetapi saya tidak dapat mengirim data melaluinya atau menerima data melalui salah satu arah (saya tidak tahu di mana masalahnya).

Saya sudah mencoba mengubah pengkodean data yang saya kirim, saya sudah mencoba mengirim data berulang kali jika ini masalah waktu, sepertinya ini bukan masalahnya.

Kode server C:

int makeSocket(struct sockaddr_un * addr, char* path){

  unlink(path);

  int sock;
  //struct sockaddr_un addr;
  sock = socket(AF_UNIX, SOCK_STREAM, 0);
  fcntl(sock, F_SETFL, O_NONBLOCK);
  addr->sun_family = AF_UNIX;
  strncpy(addr->sun_path, path, sizeof(addr->sun_path));
  size_t size = (offsetof(struct sockaddr_un, sun_path) + strlen(addr->sun_path));
  if (bind(sock, (struct sockaddr*) addr, size) < 0){
    printf("failed to bind\n");
  }
  listen(sock, 5);
  return sock;
}

//this isn't actually here but just so you can see it being created, its a global int
globSock = makeSocket("socket.soc");

Kemudian dalam panggilan balik menganggur:

f (!connected){
    int len = sizeof(addr);
    if (connection = accept(globSock, (struct sockaddr*) &addr, &len) < 0){
      printf("Can't listen\n");
    } else {
      printf("connected\n");
      send(connection, "HI", strlen("HI"), 0);
      connected = 1;
    }
  } else {
    int rc;
    if (!recevd && ((rc = recv(connection,buffer,BUFFERSIZE,0)) < 0)){
      printf("nope %s\n", buffer);
    } else if (rc == 0) {
      connected = 0;
      printf("%s\n", buffer);
    } else {
      recevd = 1;
      printf("%s\n", buffer);
    }
  }

terhubung dan menerima adalah variabel flag dan buffer adalah array char (ukuran buffer adalah 100, hanya #define)

Klien Python:

# -*- coding: utf-8 -*-
import socket
import os

print("Connecting...")
if os.path.exists("socket.soc"):
    client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    client.connect("socket.soc")
    print("Ready.")
    print("Ctrl-C to quit.")
    print("Sending 'DONE' shuts down the server and quits.")
    while True:
        try:
            x = input("> ")
            if "" != x:
                print("SEND:", x)
                client.send(x.encode('utf-8'))
                if "DONE" == x:
                    print("Shutting down.")
                    break
        except KeyboardInterrupt as k:
            print("Shutting down.")
            client.close()
            break
else:
    print("Couldn't Connect!")
    print("Done")

Di sisi C berulang kali mencetak "tidak" (saya belum menerima apa pun yang dicetak) dan di sisi python hanya meminta masukan, Anda dapat memberikan pesan, ia akan 'mengirimkannya' dan kemudian meminta yang lain dll...


person Yannik Nelson    schedule 19.07.2019    source sumber
comment
Seperti yang selalu Jonathan Leffler usulkan di postingan lain, Anda perlu memeriksa nilai yang dikembalikan.   -  person snr    schedule 19.07.2019
comment
Dan perhatikan bahwa strncpy() tidak menghentikan string: stackoverflow .com/questions/1453876/   -  person Andrew Henle    schedule 19.07.2019
comment
Tak satu pun dari ini membantu, saya tidak dapat melihat nilai pengembalian apa pun karena recv tidak memasukkan apa pun ke dalam buffer. Komentar strncpy juga tidak membantu karena merujuk pada tempat soket dibuat, di mana tidak ada bug, seperti yang dinyatakan.   -  person Yannik Nelson    schedule 19.07.2019


Jawaban (1)


Masalahnya sudah masuk

if (connection = accept(globSock, (struct sockaddr*) &addr, &len) < 0){

itu menyimpan perbandingan dalam koneksi daripada soket sebenarnya, solusinya adalah:

if ((connection = accept(globSock, (struct sockaddr*) &addr, &len)) < 0){
person Yannik Nelson    schedule 19.07.2019