• <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>

            doing5552

            記錄每日點滴,不枉人生一世

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

            公告

            常用鏈接

            留言簿(24)

            我參與的團隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 454873
            • 排名 - 48

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            這篇日志還是先從一個能夠運行起來的例子出發,一旦能順利的看到程序的成功運行,那么接下來的事件我想應該是問為什么了?似乎這樣更加容易理解和掌握。

            對于socket程序的概念這里就不多寫了,但我相信,如果能看完這整篇文章,我相信不會再有這樣的疑問的。

            下面將編寫一個c/s結構的程序,主要功能是client將向server發送一些消息,而當server收到client的請求時,并向client發送一條回應信息。

            server.c代碼如下:

            #include <stdio .h>
            #include < stdlib .h>
            #include < errno .h>
            #include < string .h>
            #include < sys /types.h>
            #include < netinet /in.h>
            #include < sys /socket.h>
            #include < sys /wait.h>
             
            #define SERVPORT 3333 
            #define BACKLOG 10
            #define MAXSIZE 1024
             
            int main() {
            int sockfd,client_fd;
            struct sockaddr_in my_addr;
            struct sockaddr_in remote_addr;
            //創建套接字
            if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
            perror("socket create failed!");
            exit(1);
            }
             
            //綁定端口地址
            my_addr.sin_family      = AF_INET;
            my_addr.sin_port        = htons(SERVPORT);
            my_addr.sin_addr.s_addr = INADDR_ANY;
            bzero(&(my_addr.sin_zero),8);
            if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) {
            perror("bind error!");
            exit(1);
            }
             
            //監聽端口
            if (listen(sockfd, BACKLOG) == -1) {
            perror("listen error");
            exit(1);
            }
             
            while (1) {
            int sin_size = sizeof(struct sockaddr_in);
            if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) {
            perror("accept error!");
            continue;
            }
            printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));
             
            //子進程段
            if (!fork()) {
            //接受client發送的請示信息
            int rval;
            char buf[MAXSIZE];
            if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {
            perror("reading stream error!");
            continue;
            }
            printf("%s\n",buf);
             
            //向client發送信息
            char* msg = "Hello,Mr hqlong, you are connected!\n";
            if (send(client_fd, msg, strlen(msg), 0) == -1) perror("send error!");
            close(client_fd);
            exit(0);
            }
            close(client_fd);
            }
            return 0;
            }

            編譯并啟動服務

            hqlong@ubuntu:~$ gcc server.c -o server
            hqlong@ubuntu:~$./server &

            這里我們的server已經作為一個服務后臺運行,如果想知道后臺的服務的運行狀態,可能使用netstat來查看.

            hqlong@ubuntu:~/t$ netstat -nl | grep 3333
            tcp        0      0 0.0.0.0:3333            0.0.0.0:*               LISTEN

            可以看出3333端口已經在監聽,這說明服務已經啟動。
            為了測試server是否可以接受client的請求,可以使用telnet來進行測試。

            hqlong@ubuntu:~$ telnet 127.0.0.1 3333
            Trying 127.0.0.1...
            Received a connection from 127.0.0.1
            Connected to 127.0.0.1.
            Escape character is '^]'.
            test
            test
             
            Hello,Mr hqlong, you are connected!
            Connection closed by foreign host.

            可以看出,我們使用telnet來連接剛所啟動的server,然后向該server發送了一條信息”test”,server收到了這條信息后,向client發送了一條響應信息,告訴我們,我們已經連接上了。

            接下來來編寫自己的client程序,完成的功能和上面的telnet的測試功能一樣,向server發送一條信息,server在收到這條信息后,向client發送一條響應信息。
            代碼如下:client.c

            #include < stdio .h>
            #include < stdlib .h>
            #include < errno .h>
            #include < string .h>
            #include < sys /types.h>
            #include < netinet /in.h>
            #include < sys /socket.h>
            #include < sys /wait.h>
             
            #define SERVPORT 3333
            #define MAXDATASIZE 100
            #define SERVER_IP "127.0.0.1"
            #define DATA  "this is a client message"
             
            int main(int argc, char* argv[]) {
            int sockfd, recvbytes;
            char buf[MAXDATASIZE];
            struct hostent *host;
            struct sockaddr_in serv_addr;
             
            if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket error!");
            exit(1);
            }
            bzero(&serv_addr,sizeof(serv_addr));
            serv_addr.sin_family    = AF_INET;
            serv_addr.sin_port      = htons(SERVPORT);
            serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP);
             
            if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {
            perror("connect error!");
            exit(1);
            }
             
            write(sockfd,DATA, sizeof(DATA));
            if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) {
            perror("recv error!");
            exit(1);
            }
             
            buf[recvbytes] = '\0';
            printf("Received: %s",buf);
            close(sockfd);
            return 0;
            }

            編譯運行

            hqlong@ubuntu:~$ gcc client.c -o client
            hqlong@ubuntu:~$ ./client
            Received a connection from 127.0.0.1
            Hello,Mr hqlong, you are connected!
            Connection closed by foreign host.

            以上就是整個服務器端和客戶端程序的編寫。


            上圖顯示了程序使用面向連接協議(tcp)時,進行的典型socket系統調用。服務器程序建立了一個socket,并調用bind函數將此socket和本地協議端口聯系起來,然后用listen和accept函數將此socket參數置于被動的監聽模式并接收到建立連接。
            客戶程序也建立一個socket,接著調用connect函數啟動網絡對話。在客戶和服務器建立連接以后,就可以用read、write等函數進行通信了。
            具體函數細節請參考linux c函數手冊
            http://man.chinaunix.net/develop/c&c++/linux_c/default.htm

            posted on 2010-01-12 20:33 doing5552 閱讀(1459) 評論(2)  編輯 收藏 引用

            Feedback

            # re: linux c/c++ socket程序的編寫 2012-04-20 10:52 Luwei
            必須加入頭文件#include <arpa/inet.h>  回復  更多評論
              

            # re: linux c/c++ socket程序的編寫[未登錄] 2012-10-24 14:26 lele
            非常感謝  回復  更多評論
              

            亚洲狠狠综合久久| 婷婷综合久久中文字幕蜜桃三电影| 久久99精品国产麻豆不卡| 久久九九精品99国产精品| 久久夜色精品国产亚洲| 久久精品国产亚洲AV不卡| 国产精品久久久久久久午夜片 | 久久久久久曰本AV免费免费| 性做久久久久久久久久久| 日韩va亚洲va欧美va久久| 久久久久婷婷| 久久九九久精品国产免费直播| 亚洲欧美日韩精品久久亚洲区 | 亚洲香蕉网久久综合影视| 亚洲国产精品综合久久一线| 青春久久| 亚洲色大成网站WWW久久九九| 思思久久好好热精品国产| 中文字幕久久波多野结衣av| 久久精品国产男包| 精品久久久久久无码中文字幕一区| 久久人人爽人人爽人人片AV不| 国产精品免费看久久久| 99久久婷婷国产综合精品草原| 欧美日韩精品久久久免费观看| 亚洲欧美国产精品专区久久| 中文字幕日本人妻久久久免费| 国内精品九九久久久精品| 国产99久久久国产精品~~牛| 久久久国产视频| 精品久久无码中文字幕| 欧美午夜A∨大片久久| 99久久免费国产特黄| 伊人久久大香线蕉成人| 亚洲综合久久综合激情久久| 一本一本久久A久久综合精品| 精品国产福利久久久| 人人狠狠综合久久亚洲| 久久99国产精品久久99果冻传媒| 无码8090精品久久一区| 精品视频久久久久|