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

            記錄每日點(diǎn)滴,不枉人生一世

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

            公告

            常用鏈接

            留言簿(24)

            我參與的團(tuán)隊(duì)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 454884
            • 排名 - 48

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

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

            下面將編寫一個(gè)c/s結(jié)構(gòu)的程序,主要功能是client將向server發(fā)送一些消息,而當(dāng)server收到client的請求時(shí),并向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;
            }

            編譯并啟動(dòng)服務(wù)

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

            這里我們的server已經(jīng)作為一個(gè)服務(wù)后臺(tái)運(yùn)行,如果想知道后臺(tái)的服務(wù)的運(yùn)行狀態(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)啟動(dò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來連接剛所啟動(dòng)的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;
            }

            編譯運(yùn)行

            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.

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


            上圖顯示了程序使用面向連接協(xié)議(tcp)時(shí),進(jìn)行的典型socket系統(tǒng)調(diào)用。服務(wù)器程序建立了一個(gè)socket,并調(diào)用bind函數(shù)將此socket和本地協(xié)議端口聯(lián)系起來,然后用listen和accept函數(shù)將此socket參數(shù)置于被動(dòng)的監(jiān)聽模式并接收到建立連接。
            客戶程序也建立一個(gè)socket,接著調(diào)用connect函數(shù)啟動(dòng)網(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 閱讀(1459) 評(píng)論(2)  編輯 收藏 引用

            Feedback

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

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


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


            99久久久精品免费观看国产| 人妻中文久久久久| 久久亚洲国产中v天仙www | 久久久久久国产精品美女| 无码国内精品久久人妻麻豆按摩 | 青青青国产成人久久111网站| 国产AV影片久久久久久| 日本精品久久久久久久久免费| 久久久国产精华液| 激情久久久久久久久久| 一本一本久久a久久综合精品蜜桃| 国产人久久人人人人爽| 久久只有这里有精品4| 国产成人精品久久二区二区| 久久人人爽人人精品视频| 久久综合噜噜激激的五月天| 无码任你躁久久久久久老妇| 日本精品久久久久中文字幕8| 久久妇女高潮几次MBA| 久久嫩草影院免费看夜色| 国产亚洲婷婷香蕉久久精品| 久久精品国产精品亚洲精品 | 18禁黄久久久AAA片| 99国内精品久久久久久久 | 日产久久强奸免费的看| 久久夜色精品国产亚洲| 久久精品国产亚洲AV麻豆网站 | 日韩精品久久久久久久电影| 日本精品久久久久中文字幕| 久久青青草原精品国产| 狠狠综合久久综合88亚洲| 久久久久久久91精品免费观看| 久久久久亚洲AV无码去区首| 97久久精品人人做人人爽| 精品一区二区久久久久久久网站| 人妻精品久久久久中文字幕69| 日韩精品久久久久久久电影蜜臀 | 国内精品久久久久久久久| 久久99精品国产99久久6| 国产精品激情综合久久| 久久综合亚洲色HEZYO国产|