• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            公告

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            • 隨筆 - 9
            • 文章 - 13
            • 評論 - 3
            • 引用 - 0

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            一個socket實例===轉
            // TCP的socket連接示例
            // Saturday,?4.?March?2006,?05:35:49
            /*
            Socket,?TCP,?異步?
            tp://www.zeali.net/blog/entry.php?id=13

            用C實現的TCP?socket連接/讀/寫操作。采用fcntl設置非阻塞式連接以實現connect超時處理;采用select方法來設置socket讀寫超時。此示例可被編譯運行于Windows/unix系統。

            源文件connector.c

            原來的代碼在windows下編譯不通過,今天qzj問起才發現。因為加了異步的處理,沒有對這部分代碼進行兼容性處理。本著做學問一絲不茍嘀精神,重新修改了一下源代碼。以下代碼在VC++6和linux下編譯執行通過?

            同時mark幾個有用的url:

            http://people.web.psi.ch/rohrer_u/sample1.htm ?Demo?program?for?remote?CAMAC?access?via?TCP/IP

            http://www.lsword.net/code/list.asp?id=1383 ?將Socket應用程序從Unix向Windows移植中應注意的幾點問題
            */

            /*
            *?on?Unix:
            *?cc?-c?connector.c
            *?cc?-o?connector?connector.o
            *
            *?on?Windows?NT:
            *?open?connector.c?in?Visual?Studio
            *?press?'F7'?to?link?--?a?project?to?be?created
            *?add?wsock32.lib?to?the?link?section?under?project?setting
            *?press?'F7'?again
            *
            *?running:
            *?type?'connector'?for?usage
            */


            #include?
            < stdio.h >
            #include?
            < stdlib.h >
            #include?
            < string .h >
            #include?
            < stdarg.h >
            #include?
            < errno.h >
            #include?
            < fcntl.h >
            #ifdef?WIN32
            #include?
            < winsock2.h >
            #else
            #include?
            < unistd.h >
            #include?
            < sys / types.h >
            #include?
            < sys / socket.h >
            #include?
            < sys / ioctl.h >
            #include?
            < netinet / in .h >
            #include?
            < arpa / inet.h >
            #include?
            < netdb.h >
            #endif

            #ifndef?INADDR_NONE
            #define ?INADDR_NONE?0xffffffff
            #endif
            #define ?MAX_STRING_LEN?1024
            #define ?BUFSIZE?2048

            #ifndef?WIN32
            #define ?SOCKET?int
            #else
            #define ?errno?WSAGetLastError()
            #define ?close(a)?closesocket(a)
            #define ?write(a,?b,?c)?send(a,?b,?c,?0)
            #define ?read(a,?b,?c)?recv(a,?b,?c,?0)
            #endif

            char ?buf[BUFSIZE];

            static ? char ?i_host[MAX_STRING_LEN];? /* ?site?name? */
            static ? char ?i_port[MAX_STRING_LEN];? /* ?port?number? */

            void ?err_doit( int ?errnoflag,? const ? char ? * fmt,?va_list?ap);
            void ?err_quit( const ? char ? * fmt,?);
            int ?tcp_connect( const ? char ? * host,? const ?unsigned? short ?port);
            void ?print_usage();

            // xnet_select?x?defines
            #define ?READ_STATUS?0
            #define ?WRITE_STATUS?1
            #define ?EXCPT_STATUS?2

            /*
            s?-?SOCKET
            sec?-?timeout?seconds
            usec?-?timeout?microseconds
            x?-?select?status
            */

            SOCKET?xnet_select(SOCKET?s,?
            int ?sec,? int ?usec,? short ?x)
            {
            int ?st? = ?errno;
            struct ?timeval?to;
            fd_set?fs;
            to.tv_sec?
            = ?sec;
            to.tv_usec?
            = ?usec;
            FD_ZERO(
            & fs);
            FD_SET(s,?
            & fs);
            switch (x) {
            case ?READ_STATUS:
            st?
            = ?select(s + 1 ,? & fs,? 0 ,? 0 ,? & to);
            break ;
            case ?WRITE_STATUS:
            st?
            = ?select(s + 1 ,? 0 ,? & fs,? 0 ,? & to);
            break ;
            case ?EXCPT_STATUS:
            st?
            = ?select(s + 1 ,? 0 ,? 0 ,? & fs,? & to);
            break ;
            }

            return (st);
            }


            int ?tcp_connect( const ? char ? * host,? const ?unsigned? short ?port)
            {
            unsigned?
            long ?non_blocking? = ? 1 ;
            unsigned?
            long ?blocking? = ? 0 ;
            int ?ret? = ? 0 ;
            char ? * ?transport? = ? " tcp " ;
            struct ?hostent? * phe;? /* ?pointer?to?host?information?entry? */
            struct ?protoent? * ppe;? /* ?pointer?to?protocol?information?entry */
            struct ?sockaddr_in?sin;? /* ?an?Internet?endpoint?address? */
            SOCKET?s;?
            /* ?socket?descriptor?and?socket?type? */
            int ?error;

            #ifdef?WIN32
            {
            WORD?wVersionRequested;
            WSADATA?wsaData;
            int ?err;

            wVersionRequested?
            = ?MAKEWORD(? 2 ,? 0 ?);

            err?
            = ?WSAStartup(?wVersionRequested,? & wsaData?);
            if ?(?err? != ? 0 ?)? {
            /* ?Tell?the?user?that?we?couldn't?find?a?usable? */
            /* ?WinSock?DLL.? */
            printf(
            " can't?initialize?socket?library\n " );
            exit(
            0 );
            }

            }

            #endif ?

            memset(
            & sin,? 0 ,? sizeof (sin));
            sin.sin_family?
            = ?AF_INET;

            if ?((sin.sin_port? = ?htons(port))? == ? 0 )
            err_quit(
            " invalid?port?\ " % d\ " \n " ,?port);

            /* ?Map?host?name?to?IP?address,?allowing?for?dotted?decimal? */
            if ?(?phe? = ?gethostbyname(host)?)
            memcpy(
            & sin.sin_addr,?phe -> h_addr,?phe -> h_length);
            else ? if ?(?(sin.sin_addr.s_addr? = ?inet_addr(host))? == ?INADDR_NONE?)
            err_quit(
            " can't?get?\ " % s\ " ?host?entry\n " ,?host);

            /* ?Map?transport?protocol?name?to?protocol?number? */
            if ?(?(ppe? = ?getprotobyname(transport))? == ? 0 )
            err_quit(
            " can't?get?\ " % s\ " ?protocol?entry\n " ,?transport);

            /* ?Allocate?a?socket? */
            s?
            = ?socket(PF_INET,?SOCK_STREAM,?ppe -> p_proto);
            if ?(s? < ? 0 )
            err_quit(
            " can't?create?socket:?%s\n " ,?strerror(errno));

            /* ?Connect?the?socket?with?timeout? */
            #ifdef?WIN32
            ioctlsocket(s,FIONBIO,
            & non_blocking);
            #else
            ioctl(s,FIONBIO,
            & non_blocking);
            #endif
            // fcntl(s,F_SETFL,?O_NONBLOCK);
            if ?(connect(s,?( struct ?sockaddr? * ) & sin,? sizeof (sin))? == ? - 1 ) {
            struct ?timeval?tv;?
            fd_set?writefds;
            // ?設置連接超時時間
            tv.tv_sec? = ? 10 ;? // ?秒數
            tv.tv_usec? = ? 0 ;? // ?毫秒
            FD_ZERO( & writefds);?
            FD_SET(s,?
            & writefds);?
            if (select(s + 1 ,NULL, & writefds,NULL, & tv)? != ? 0 ) {?
            if (FD_ISSET(s, & writefds)) {
            int ?len = sizeof (error);?
            // 下面的一句一定要,主要針對防火墻?
            if (getsockopt(s,?SOL_SOCKET,?SO_ERROR,?( char ? * ) & error,? & len)? < ? 0 )
            goto ?error_ret;?
            if (error? != ? 0 )?
            goto ?error_ret;?
            }

            else
            goto ?error_ret;? // timeout?or?error?happen?
            }

            else ? goto ?error_ret;?;?

            #ifdef?WIN32
            ioctlsocket(s,FIONBIO,
            & blocking);
            #else
            ioctl(s,FIONBIO,
            & blocking);
            #endif

            }

            else {
            error_ret:
            close(s);
            err_quit(
            " can't?connect?to?%s:%d\n " ,?host,?port);
            }

            return ?s;
            }


            void ?err_doit( int ?errnoflag,? const ? char ? * fmt,?va_list?ap)
            {
            int ?errno_save;
            char ?buf[MAX_STRING_LEN];

            errno_save?
            = ?errno;?
            vsprintf(buf,?fmt,?ap);
            if ?(errnoflag)
            sprintf(buf?
            + ?strlen(buf),? " :?%s " ,?strerror(errno_save));
            strcat(buf,?
            " \n " );
            fflush(stdout);
            fputs(buf,?stderr);
            fflush(NULL);
            return ;
            }


            /* ?Print?a?message?and?terminate.? */
            void ?err_quit( const ? char ? * fmt,?)
            {
            va_list?ap;
            va_start(ap,?fmt);
            err_doit(
            0 ,?fmt,?ap);
            va_end(ap);
            exit(
            1 );
            }


            #ifdef?WIN32
            char ? * optarg;

            char ?getopt( int ?c,? char ? * v[],? char ? * opts)
            {
            static ? int ?now? = ? 1 ;
            char ? * p;

            if ?(now? >= ?c)? return ?EOF;

            if ?(v[now][ 0 ]? == ? ' - ' ? && ?(p? = ?strchr(opts,?v[now][ 1 ])))? {
            optarg?
            = ?v[now + 1 ];
            now?
            += 2 ;
            return ? * p;
            }


            return ?EOF;
            }


            #else
            extern ? char ? * optarg;
            #endif

            #define ?required(a)?if?(!a)?{?return?-1;?}

            int ?init( int ?argc,? char ? * argv[])
            {
            char ?c;
            // int?i,optlen;
            // int?slashcnt;

            i_host[
            0 ]? = ? ' \0 ' ;
            i_port[
            0 ]? = ? ' \0 ' ;

            while ?((c? = ?getopt(argc,?argv,? " h:? " ))? != ?EOF)? {
            if ?(c? == ? ' ? ' )
            return ? - 1 ;
            switch ?(c)? {?
            case ? ' h ' :
            required(optarg);
            strcpy(i_host,?optarg);
            break ;
            case ? ' p ' :
            required(optarg);
            strcpy(i_port,?optarg);
            break ;
            default :
            return ? - 1 ;
            }

            }


            /* ?
            *?there?is?no?default?value?for?hostname,?port?number,?
            *?password?or?uri
            */

            if ?(i_host[ 0 ]? == ? ' \0 ' ? || ?i_port[ 0 ]? == ? ' \0 ' )
            return ? - 1 ;

            return ? 1 ;
            }


            void ?print_usage()
            {
            char ? * usage[]? =
            {
            " Usage: " ,
            " ?-h?host?name " ,
            " ?-p?port " ,
            " example: " ,
            " ?-h?127.0.0.1?-p?4001 " ,
            }
            ;?
            int ?i;

            for ?(i? = ? 0 ;?i? < ? sizeof (usage)? / ? sizeof ( char * );?i ++ )
            printf(
            " %s\n " ,?usage);

            return ;
            }


            int ?main( int ?argc,? char ? * argv[])
            {
            SOCKET?fd;
            int ?n;

            /* ?parse?command?line?etc?? */
            if ?(init(argc,?argv)? < ? 0 )? {
            print_usage();
            exit(
            1 );
            }


            buf[
            0 ]? = ? ' \0 ' ;

            /* ?pack?the?info?into?the?buffer? */ ?
            strcpy(buf,?
            " HelloWorld " );

            /* ?make?connection?to?the?server? */
            fd?
            = ?tcp_connect(i_host,?(unsigned? short )atoi(i_port));

            if (xnet_select(fd,? 0 ,? 500 ,?WRITE_STATUS) > 0 ) {
            /* ?send?off?the?message? */
            write(fd,?buf,?strlen(buf));
            }

            else {
            err_quit(
            " Socket?I/O?Write?Timeout?%s:%s\n " ,?i_host,?i_port);
            }


            if (xnet_select(fd,? 3 ,? 0 ,?READ_STATUS) > 0 ) {
            /* ?display?the?server?response? */
            printf(
            " Server?response:\n " );
            n?
            = ?read(fd,?buf,?BUFSIZE);
            buf[n]?
            = ? ' \0 ' ;
            printf(
            " %s\n " ,?buf);
            }

            else {
            err_quit(
            " Socket?I/O?Read?Timeout?%s:%s\n " ,?i_host,?i_port);
            }

            close(fd);

            #ifdef?WIN32
            WSACleanup();
            #endif

            return ? 0 ;
            }



            posted on 2006-09-22 15:24 blues 閱讀(2606) 評論(0)  編輯 收藏 引用

            国产精品伊人久久伊人电影 | 精品视频久久久久| 国产成人99久久亚洲综合精品 | 国产69精品久久久久久人妻精品| 囯产极品美女高潮无套久久久| 新狼窝色AV性久久久久久| 色综合久久综合网观看| 久久亚洲精品国产亚洲老地址 | 久久久久人妻一区精品| 人妻精品久久久久中文字幕一冢本| 久久国产精品无码HDAV| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲精品蜜桃久久久久久| 国产福利电影一区二区三区,免费久久久久久久精 | 91精品国产综合久久精品| 深夜久久AAAAA级毛片免费看| 国产精品久久久福利| 色偷偷88欧美精品久久久 | 久久国产高清一区二区三区| 99久久精品国产一区二区| 久久精品国产亚洲Aⅴ香蕉| 亚洲午夜精品久久久久久人妖| 精品久久久无码21p发布| 亚洲v国产v天堂a无码久久| 夜夜亚洲天天久久| 国产一区二区三区久久精品| 无码国产69精品久久久久网站| 亚洲精品WWW久久久久久| 久久精品亚洲福利| 久久久久国产一区二区| 久久不见久久见免费影院www日本| 粉嫩小泬无遮挡久久久久久| 欧美熟妇另类久久久久久不卡| 三级三级久久三级久久| 久久亚洲AV无码精品色午夜| 亚洲欧洲中文日韩久久AV乱码| 久久亚洲国产精品123区| 久久www免费人成精品香蕉| 女同久久| 伊人久久大香线焦AV综合影院| 久久精品国产亚洲AV影院|