Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sizeof()在c中返回奇怪的值_C_Sockets - Fatal编程技术网

sizeof()在c中返回奇怪的值

sizeof()在c中返回奇怪的值,c,sockets,C,Sockets,大家好,我正在为一个分配实现一个多协议服务器,问题是当我将一个函数(它与TCP配合得很好)与UDP一起使用时,它会为sizeof(rslt)返回一些奇怪的值 这是打印sizeof(rslt)的结果 2272472973019473502357478709778135745577468557658424998002441906536119128023452627511009718538762421963963794180488222893264995956639137025856510462532

大家好,我正在为一个分配实现一个多协议服务器,问题是当我将一个函数(它与TCP配合得很好)与UDP一起使用时,它会为sizeof(rslt)返回一些奇怪的值 这是打印sizeof(rslt)的结果

227247297301947350235747870977813574557746855765842499800244190653611912802345262751100971853876242196396379418048822289326499595663913702585651046253256334452274950507892388016152332207357456528202978444159487749182703597538436094324394051880354838420203925482233596686868686866767674141414141414175756742644798608214126898620261227036196985617864721898152919768989286234621310882472277578077210724037954593348269148476835319682392369405001998132692888272764779291883841036795450173075483486283316456690985689093706570659715313373418416626032785942216737626420701207457060042692034113809058230242645165284602182668910345057412276106351085668501025471942442344915958025484738205854146122217473526142186017692920701058864986750388007266706549779899075196338201185437947481794203307088943805129359229291979011929586850204537014834772436384414446076445840451035668547324720434371828348370311512769864669240050561072731126155761543055808184568318969867074799216668048506769780091751394820116008722477816961981513603374444219862671625188097499622795413732901409586672517257870771774219174910321872828714060096821866760216162806693047039766836263375334134647593797749701939073473442243496461269104846522636525828614295376224700609500018984330561783847377901850347270541006554080785016501004196534609146133120033251145149769049779036737854348655192422189329278467247499329146806230782304594733907216315718793570281926207997806702496284048904446250813724590323511394423491930232316489531788923932152258695604873877344476076989876437595819171306479678050176777718605659834558682850919638165545391335090049897674411676070277922540425363814778447530392448483914523251308861545066293730151590284107404772704776816410900457206266688174500512712866439202351398884602886744385761783550661724848436204069903056648633523485191780275321057855888694641036551796412716727623299092522858290604590099107685296585504067001603769945664562470107174837039533665273582630486408048896007093631520324322524100859517067127990524303448959286944425829576454316333690530343056674638230906634647607381640905561525257744661647440376860111016638001700783669212090565003039144740560878922353582981640243572153915886411947071159781404072261541189065424497638344651660586321264435048944204997415130063108225835529197687615484629774123116472368685958222206630054915115618507461784801046813544644398678841637428900989462942436882113514841632037095541844031558486117095067338825934681699013503068846779959159320103211142855059737404068473702861206351583475182475102776613233000438730479503921649424316454183029479504135062107345404378527466396253753476100129956781399010999183783802618238213362096457459802141302288112719940445509784486788013808151429034705404689431688949179720708879650918448834785976461292411819273867025864362288697787098644909453881997881572293361444958689283701304285225816849883161755671238872886017097379498420189964777858519101592688663228198394897922360739652434440789667093624907437541226941591245240520207924844128128689438000349924777668111471837242091354159876382021580285379055144718999771005721982983040428783187294609501155912764173768110035459865747935310753231316846263813392915098534543581632657148613313847771071945323639593164682251934093473442545195777200094227132896445437604026121219696929191697809114520884878334125905900512421291098451577200081936661332535029167862238105207037779640033290580769523854129888509506515360662130224968227136008058671505279388721663085953930853769866032069329590096954491495015630933753747808211859974560578358111052927752530637720023827194678573934473710792224546360846934854848774794845984636928997991447694646355496557324158438719071147050424155219037044882503261933744024145388096967434144945092298185160371896905205559404947754870769573442000107814157031764157282408089592334394363291279752699027873173998478039717457143900373272033155054527496375858737124960562284419088384.000000

服务器

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <netinet/tcp.h>
#include <errno.h>

#define MAXLINE 100


struct equation {
    float a;
    char c;
    float b;
};

struct result {
    long double res;
};

int MAX (int a,int b){
    if (a>b) return a;
    return b;
}


int readn(int fd, void *vptr, size_t n)
{
    size_t  nleft;
    ssize_t nread;
    char   *ptr;
    ptr = vptr;
    nleft = n;
    while (nleft > 0) {
        if ( (nread = read(fd, ptr, nleft)) < 0) {
            if (errno == EINTR)
                nread = 0;      /* and call read() again */
            else
                return (-1);
        } else if (nread == 0)
            break;              /* EOF */

        nleft -= nread;
        ptr += nread;
    }
    return (n - nleft);         /* return >= 0 */
}


int writen(int fd, const void *vptr, size_t n)
{
    size_t nleft;
    ssize_t nwritten;
    const char *ptr;
    printf ("\nI'm In %Lf\n",n);
    ptr = vptr;
    nleft = n;
    printf ("%Lf NNNNN  %Lf SIZE %Lf \n",nleft,n,sizeof(*vptr));
    while (nleft > 0) {
        printf ("%Lf\n",nleft);
        fflush (stdout);
        if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
            if (nwritten < 0 && errno == EINTR)
                nwritten = 0;   /* and call write() again */
            else
                return (-1);    /* error */
        }

        nleft -= nwritten;
        ptr += nwritten;
    }
    printf ("\n 5alawees \n");
// printf ("\n%s\n",vptr);
//    ffulsh (stdout);
    return (n);
}

void HandleClient(int comm_fd);
void Die (const char * msg)
{
    perror(msg);
    exit(1);
}

int passiveUDP (short port){
    struct sockaddr_in servaddr;
    int listen_fd;
    if ((listen_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        Die("Falied to create socket");
    };

    //printf ("%d" ,listen_fd);
    memset( &servaddr,0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(port);

    if (bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
    {
        Die("Failed to bind socket to address");
    }
    return listen_fd;
}

int passiveTCP (short port){
    struct sockaddr_in servaddr;
    int listen_fd;
    if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        Die("Falied to create socket");
    };

    memset( &servaddr,0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(port);

    if (bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
    {
        Die("Failed to bind socket to address");
    }

    if (listen(listen_fd, 10) < 0)
    {
        Die("Failed to listen on server socket");
    }
    return listen_fd;
}

int main(int argc, char * argv[])
{
    if (argc != 2) {
        fprintf(stderr, "USAGE: ./HelloITServer <port>\n");
        exit(1);
    }
    char str[100];
    int listen_fd, comm_fd;
    int    usock = passiveUDP (atoi (argv[1]));               /* UDP socket  */

    int    tsock = passiveTCP (atoi (argv[1]));           /* TCP master socket  */
    int    nfds;
    fd_set rfds;                 /* readable file descriptors */
    struct sockaddr_in fsin;     /* the request from address */

    nfds = MAX(tsock, usock) + 1;
    FD_ZERO(&rfds);
    while (1) {
        FD_SET(tsock, &rfds);
        FD_SET(usock, &rfds);
        printf ("HELLO");
        if(select(nfds, &rfds, NULL, NULL, NULL) < 0){
            printf("select error: %d \n",errno);
            exit (1);
        }
        if(FD_ISSET(tsock, &rfds))
        {
            /* TCP slave socket */
            printf ("Hello TCP");
            int ssock;
            //int alen = sizeof(fsin);
            ssock = accept(tsock, (struct sockaddr *) NULL, NULL);
            if(ssock < 0)
                Die("accept failed: jkjkjkjkjkj \n");
            HandleClient (ssock);
            close (ssock);
        }
        if(FD_ISSET(usock, &rfds))
        {
            printf ("Hello UDP");
            HandleClient (usock);
        }
    }

}
void HandleClient(int comm_fd)
{
    struct equation eq;
    struct result rslt;
    bzero (&eq,sizeof (eq));
    bzero (&rslt, sizeof (rslt));
    if ((readn (comm_fd, &eq, sizeof(eq))) == 0){
        Die("Failed to receive from client");
    }
    printf ("\n%Lf  %Lf\n",sizeof (struct result),sizeof (rslt));
    printf ("reciveed %f %c %f",eq.a,eq.c,eq.b);
    switch (eq.c) {
        case '+':
            rslt.res = eq.a+eq.b;
            break;
        case '-':
            rslt.res = eq.a-eq.b;
            break;
        case '*':
            rslt.res = eq.a*eq.b;
            break;
        case '/':
            rslt.res = eq.a/eq.b;
            break;
        case '%':
            rslt.res = (int)eq.a% (int)eq.b;
            break;
        default:
            break;
    }
    printf ("\n%Lf\n",sizeof(rslt));
    printf ("\n%Lf\n",sizeof(rslt));
    printf ("\n%Lf\n",sizeof(rslt));

    writen (comm_fd, &rslt, sizeof (rslt));
    //close (comm_fd);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAXLINE 100
结构方程{
浮动a;
字符c;
浮球b;
};
结构结果{
长双色;
};
最大整数(整数a,整数b){
如果(a>b)返回a;
返回b;
}
int readn(int fd,void*vptr,size\u t n)
{
尺寸(左);;
ssize_t nread;
char*ptr;
ptr=vptr;
nleft=n;
而(nleft>0){
如果((nread=read(fd,ptr,nleft))<0){
如果(errno==EINTR)
nread=0;/*并再次调用read()*/
其他的
返回(-1);
}如果(nread==0),则为else
中断;/*EOF*/
nleft-=nread;
ptr+=nread;
}
return(n-nleft);/*return>=0*/
}
整数写入(整数fd,常数void*vptr,大小n)
{
尺寸(左);;
没有写的;
常量字符*ptr;
printf(“\n我在%Lf\n”,n);
ptr=vptr;
nleft=n;
printf(“%Lf NNNNN%Lf SIZE%Lf\n”,nleft,n,sizeof(*vptr));
而(nleft>0){
printf(“%Lf\n”,nleft);
fflush(stdout);
如果((nwrite=write(fd,ptr,nleft))=0*/
}
整数写入(整数fd,常数void*vptr,大小n)
{
尺寸(左);;
没有写的;
常量字符*ptr;
ptr=vptr;
nleft=n;
而(nleft>0){
if((nwrite=write(fd,ptr,nleft))
sizeof()
返回未指定类型的无符号整数值

格式规范
%Lf
需要一个
长双精度
参数

尝试:

或者如果要打印
rslt
的内容:

printf ("\n%Lf\n",rslt.res);
请注意,当我编译诸如
printf(“%Lf\n”,sizeof(rslt));
w之类的代码时
printf ("\n%u\n",(unsigned int) sizeof(rslt));
printf ("\n%Lf\n",rslt.res);
so-test.c:13:33: warning: format ‘%Lf’ expects argument of type ‘long double’, but argument 2 has type ‘long unsigned int’ [-Wformat]
printf ("\n%Lf  %Lf\n",sizeof (struct result),sizeof (rslt));
...
printf ("\n%Lf\n",sizeof(rslt));
printf ("\n%Lf\n",sizeof(rslt));
printf ("\n%Lf\n",sizeof(rslt));