• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

            公告

            常用鏈接

            留言簿(24)

            我參與的團隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 454925
            • 排名 - 48

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

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

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

            下面將編寫一個c/s結(jié)構(gòu)的程序,主要功能是client將向server發(fā)送一些消息,而當(dāng)server收到client的請求時,并向client發(fā)送一條回應(yīng)信息。

            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;
            //創(chuàng)建套接字
            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);
            }
             
            //監(jiān)聽端口
            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));
             
            //子進(jìn)程段
            if (!fork()) {
            //接受client發(fā)送的請示信息
            int rval;
            char buf[MAXSIZE];
            if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {
            perror("reading stream error!");
            continue;
            }
            printf("%s\n",buf);
             
            //向client發(fā)送信息
            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;
            }

            編譯并啟動服務(wù)

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

            這里我們的server已經(jīng)作為一個服務(wù)后臺運行,如果想知道后臺的服務(wù)的運行狀態(tài),可能使用netstat來查看.

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

            可以看出3333端口已經(jīng)在監(jiān)聽,這說明服務(wù)已經(jīng)啟動。
            為了測試server是否可以接受client的請求,可以使用telnet來進(jìn)行測試。

            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發(fā)送了一條信息”test”,server收到了這條信息后,向client發(fā)送了一條響應(yīng)信息,告訴我們,我們已經(jīng)連接上了。

            接下來來編寫自己的client程序,完成的功能和上面的telnet的測試功能一樣,向server發(fā)送一條信息,server在收到這條信息后,向client發(fā)送一條響應(yīng)信息。
            代碼如下: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.

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


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

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

            Feedback

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

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


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            午夜精品久久久久久久| 国产毛片久久久久久国产毛片| 久久国产欧美日韩精品免费| 日本精品久久久久久久久免费| 99久久精品免费看国产一区二区三区 | 99久久精品国产一区二区| 久久精品9988| 久久午夜无码鲁丝片秋霞 | 99久久人人爽亚洲精品美女| 久久久精品视频免费观看| 亚洲国产成人精品91久久久 | 国产免费久久久久久无码| 日韩一区二区三区视频久久| 精品久久久久久中文字幕人妻最新| 国产69精品久久久久99尤物| 精品人妻伦九区久久AAA片69| 亚洲精品高清国产一久久| 国产色综合久久无码有码| 国产精品欧美久久久天天影视| 欧美日韩中文字幕久久久不卡| 久久久久久夜精品精品免费啦| 手机看片久久高清国产日韩| 丁香五月综合久久激情| 精品国产VA久久久久久久冰| 久久久亚洲欧洲日产国码是AV| 狠狠久久综合伊人不卡| 精品国产一区二区三区久久| 亚洲国产精品久久电影欧美| 欧美久久久久久午夜精品| 青青草国产成人久久91网| 国产精品一久久香蕉产线看| 少妇人妻88久久中文字幕| 久久精品综合网| 久久无码一区二区三区少妇| 国产国产成人久久精品| 国产午夜精品理论片久久影视| 久久久女人与动物群交毛片| 亚洲午夜久久久影院| 97久久国产露脸精品国产 | 久久久91精品国产一区二区三区| 人妻丰满AV无码久久不卡 |