通过套接字c读取整数

时间:2011-07-23 15:50:10

标签: c int

我需要通过套接字读取一个整数并将其传递给函数。我做

strcpy(out,"insert id messagge\n");
if (write(sd_client,out, sizeof(out))==-1){
    printf("Error.\n");
    }
while ((read(sd_client, &id, sizeof(int)))==-1){  //id is an integer
        if(errno!=EINTR){
    printf("Error.\n");
        exit(-1);
    }
}
messaggio2(sd_client, logi, atoi(id)); //atoi(id) try to send int to func
有人可以帮我吗? :d

2 个答案:

答案 0 :(得分:1)

readwrite的第二个参数是数据的指针

当你说:

write(sd_client,out, sizeof(out))

你传递的。那应该是:

write(sd_client, &out, sizeof(out))

另外,我认为您已将id声明为int(这是正确的),那么为什么要将其传递给atoi?该函数用于从字符串中解析int。

答案 1 :(得分:0)

你所遇到的问题似乎有点模糊,因为你实际上没有提到你所得到的错误,但是从你发布的代码来看,你似乎遇到了两个不同的问题:

  1. atoi()用于将字符串值转换为整数...现在,您似乎已经有一个id值的整数,因此atoi()的参数不正确。您只需要使用sprintf()snprintf()之类的东西将整数值转换为字符串值,然后将其复制到用户定义的字符串缓冲区中,如果您想要一个字符串表示形式的整数。
  2. 您正在使用套接字,因此通过网络传输的任何信息都将以网络字节顺序进行。如果您使用的是little-endian平台,那么整数将以big-endian格式出现,并且您将解释整数的值不正确。因此,您应该使用ntohl()之类的函数将整数转换为本机平台endian格式,该函数可以在头文件netinet/in.h
  3. 中找到

    例如:

    #include <netinet/in.h>
    
    int id;
    int sd_client;
    
    //... code to open socket, etc.
    
    //add your own error-checking ... stripped out here for simplicity's sake
    read(sd_client, &id, sizeof(int));
    id = ntohl(id);
    
    char buffer[32];
    snprintf(buffer, sizeof(buffer), "%d", id);
    messaggio2(sd_client, logi, buffer);