• <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
            非常感謝  回復  更多評論
              

            久久ww精品w免费人成| 久久精品国产亚洲AV麻豆网站 | 久久久久香蕉视频| 青青草原综合久久大伊人| 久久精品国产亚洲av麻豆色欲 | 亚洲天堂久久精品| 国产69精品久久久久9999APGF | 无码国内精品久久人妻蜜桃| 成人国内精品久久久久影院| 狠狠色丁香久久婷婷综合五月 | 99久久做夜夜爱天天做精品| 久久久久亚洲AV无码专区首JN| 久久久久亚洲AV成人片| 久久99国产精一区二区三区 | 亚洲精品成人网久久久久久| 日产精品久久久久久久| 精品久久久久久国产| 久久av免费天堂小草播放| 久久精品无码专区免费东京热| 一本色道久久88精品综合| 欧美亚洲另类久久综合| 日本三级久久网| 久久青青草原国产精品免费 | 国产精品无码久久久久久| 亚洲国产精品无码久久SM| 久久99热精品| 国内精品伊人久久久影院| 久久久久无码精品国产不卡| 久久夜色精品国产欧美乱| 久久青草国产手机看片福利盒子| av国内精品久久久久影院| Xx性欧美肥妇精品久久久久久| 精品久久久久久国产三级| 久久精品www人人爽人人| 久久人人爽人人澡人人高潮AV| 人妻精品久久无码区| 亚洲成av人片不卡无码久久| 精品一区二区久久| 亚洲av日韩精品久久久久久a| 久久久久免费视频| 91久久精品国产成人久久|