【问题标题】:My python client sends an integer to the c server,but server receives 0我的python客户端向c服务器发送一个整数,但服务器收到0
【发布时间】:2016-02-04 05:48:33
【问题描述】:

服务器.c

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <unistd.h>
int main() {
       int s;
       struct sockaddr_in server, client;
       int c, l;
       s = socket(AF_INET, SOCK_STREAM, 0);
       if (s < 0) {
              printf("Eroare la crearea socketului server\n");
              return 1;
       }
       memset(&server, 0, sizeof(server));
       server.sin_port = htons(1234);
       server.sin_family = AF_INET;
       server.sin_addr.s_addr = INADDR_ANY;
       if (bind(s, (struct sockaddr *) &server, sizeof(server)) < 0) {
              printf("Eroare la bind\n");
              return 1;
       }
       listen(s, 5);
       l = sizeof(client);
       memset(&client, 0, sizeof(client));
       while (1) {
              int a, b, suma;
              c = accept(s, (struct sockaddr *) &client, &l);
              printf("S-a conectat un client.\n");
              // deservirea clientului
              recv(c, &a, sizeof(a), 0);
              recv(c, &b, sizeof(b), 0);
              a = ntohs(a);
              b = ntohs(b);
              suma = a + b;
              suma = htons(suma);
              send(c, &suma, sizeof(suma), 0);
              close(c);
              // sfarsitul deservirii clientului;
       }
}

现在的想法很简单:服务器应该收到 2 个数字相加,然后将结果发送回客户端。

client.py

import socket
import struct
import sys

def main():
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        client.connect(('localhost',1234))
    except socket.error as error:
        print('Connect error:',error)
        exit(1)
    a=int(input('a='))
    b=int(input('b='))
    try:
        client.sendall(struct.pack('!i',a))
        client.sendall(struct.pack('!i',b))
    except socket.error as error:
        print("Send error:",error)
        exit(1)
    try:
        suma=client.recv(sys.getsizeof(int))
        suma=struct.unpack('!i', suma)[0]
        print("a + b =",suma)
    except socket.error as error:
        print("Receive error:",error)
        exit(1)
if __name__ == '__main__':
    main()

客户端正确发送数字,至少我认为是这样,在具有相同功能的python服务器上,奇怪的是c客户端与python服务器一起使用,但是当我运行c服务器时python客户端,服务器同时接收值为0的a和b。有什么想法吗?

尝试使用下面提到的缓冲区,没有结果,仍然收到 0。

另外,我忘了说我检查了recv的值,正好是a和b的大小,没有recv错误。

【问题讨论】:

  • 请注意,recv() 返回一个值。这是一个你无法拒绝的提议。
  • 您需要使用ntohl 而不是ntohs
  • 请注意,recv() 返回的字节数少于请求的字节数不是错误 - 这是流媒体服务的正常行为,必须允许,(那个,零和负数,所有含义都不同东西),
  • 在你的C程序中,sizeof(a)的值是多少?
  • 使用转换函数的“短”版本会导致处理变量的前 2 个字节,而不是全部 4 个字节。对于这么小的数字,前两个字节将是 0x0000

标签: python c sockets


【解决方案1】:

您的服务器在应该使用ntohl() 时调用ntohs()s(用于“短”)版本对两字节整数进行操作。 l(用于“长”)版本对四字节整数进行操作。

试试这个:

          a = ntohl(a);
          b = ntohl(b);

          suma = htonl(suma);

参考:http://linux.die.net/man/3/htons

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多