socket編程——服務器端常用函數(shù)以及簡單實現(xiàn)

一赊颠、常用函數(shù)

1. socket()

int socket(int family, int type, int protocol);

socket()打開一個網(wǎng)絡通訊端口舟铜,如果成功的話寸齐,返回一個文件描述符弛随,應用程序可以像讀寫文件一樣用read/write在網(wǎng)絡上收發(fā)數(shù)據(jù),如果socket()調(diào)用出錯則返回-1狱庇。對于IPv4惊畏,family參數(shù)指定為AF_INET。對于TCP協(xié)議密任,type參數(shù)指定為SOCK_STREAM颜启,表示面向流的傳輸協(xié)議。如果是UDP協(xié)議浪讳,則type參數(shù)指定為SOCK_DGRAM缰盏,表示面向數(shù)據(jù)報的傳輸協(xié)議。protocol參數(shù)的介紹從略淹遵,指定為0即可口猜。

2. bind()

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);

服務器程序所監(jiān)聽的網(wǎng)絡地址和端口號通常是固定不變的,客戶端程序得知服務器程序的地址和端口號后就可以向服務器發(fā)起連接合呐,因此服務器需要調(diào)用bind綁定一個固定的網(wǎng)絡地址和端口號暮的。

bind()成功返回0笙以,失敗返回-1淌实。bind()的作用是將參數(shù)sockfdmyaddr綁定在一起,使sockfd這個用于網(wǎng)絡通訊的文件描述符監(jiān)聽myaddr所描述的地址和端口號猖腕。前面講過拆祈,struct sockaddr *是一個通用指針類型,myaddr參數(shù)實際上可以接受多種協(xié)議的sockaddr結(jié)構體倘感,而它們的長度各不相同放坏,所以需要第三個參數(shù)addrlen指定結(jié)構體的長度

3. listen()

int listen(int sockfd, int backlog);// backlog取值0~5.

典型的服務器程序可以同時服務于多個客戶端,當有客戶端發(fā)起連接時老玛,服務器調(diào)用的accept()返回并接受這個連接淤年,如果有大量的客戶端發(fā)起連接而服務器來不及處理,尚未accept的客戶端就處于連接等待狀態(tài)蜡豹,listen()聲明sockfd處于監(jiān)聽狀態(tài)麸粮,并且最多允許有backlog個客戶端處于連接待狀態(tài),如果接收到更多的連接請求就忽略镜廉。listen()成功返回0弄诲,失敗返回-1。

4. accept()

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

三方握手完成后娇唯,服務器調(diào)用accept()接受連接齐遵,如果服務器調(diào)用accept()時還沒有客戶端的連接請求寂玲,就阻塞等待直到有客戶端連接上來。cliaddr是一個傳出參數(shù)梗摇,accept()返回時傳出客戶端的地址和端口號拓哟。addrlen參數(shù)是一個傳入傳出參數(shù)(value-result argument),傳入的是調(diào)用者提供的緩沖區(qū)cliaddr的長度以避免緩沖區(qū)溢出問題伶授,傳出的是客戶端地址結(jié)構體的實際長度(有可能沒有占滿調(diào)用者提供的緩沖區(qū))彰檬。如果給cliaddr參數(shù)傳NULL,表示不關心客戶端的地址谎砾。

二逢倍、簡單實現(xiàn)服務器編程(C語言)

unsigned char TcpRecvBuf[1520];                              /* 接收緩沖區(qū) */
static  void Task_WebServer (void *pdata)
{
    struct sockaddr_in  server, client;    
    int                 sock, client_socket;
    socklen_t           len;
    
    server.sin_family       = AF_INET;                        /* 地址類型為IPv4 */
    server.sin_port         = htons( 80 );                    /* 設置服務器的端口:80端口 */
    server.sin_addr.s_addr  = htonl( INADDR_ANY );            /* 監(jiān)聽本地任意網(wǎng)卡        */
    sock = socket( AF_INET, SOCK_STREAM, 0 );                /* 使用TCP連接             */
    bind( sock, (struct sockaddr *)&server, sizeof( server ) );/* 綁定本地接口          */
    listen( sock, 5 );                                        /* 進入監(jiān)聽模式            */
    while(1) {
        len = sizeof(client);
        client_socket = accept( sock, (struct sockaddr *)&client, &len );/* 接受一個連接,會阻塞程序 */
        if(client_socket != -1) {
           /*
            * 接收數(shù)據(jù)景图,將會阻塞程序
            */
            if ((read(client_socket, TcpRecvBuf, sizeof(TcpRecvBuf))) > 0) {
               /*
                * 簡單的檢查數(shù)據(jù)是否符合HTTP協(xié)議较雕,數(shù)據(jù)內(nèi)容開頭是“GET /”
                */
                if(TcpRecvBuf[0] == 'G' && TcpRecvBuf[1] == 'E' &&
                   TcpRecvBuf[2] == 'T' && TcpRecvBuf[3] == ' ' &&
                   TcpRecvBuf[4] == '/') {
                    /**
                     * 下面為GET請求返回的數(shù)據(jù),用戶可以自己定義
                     */
                    //write(client_socket, http_html_hdr,sizeof(http_html_hdr));
                    //write(client_socket, indexdata,sizeof(indexdata));
                }
            }
            close( client_socket );                        /* 關閉此連接                      */
        }
        /** 這里可以延時一定時間 */
    }
}

參考:http://www.cnblogs.com/mddblog/p/4503054.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挚币,隨后出現(xiàn)的幾起案子亮蒋,更是在濱河造成了極大的恐慌,老刑警劉巖妆毕,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慎玖,死亡現(xiàn)場離奇詭異,居然都是意外死亡笛粘,警方通過查閱死者的電腦和手機趁怔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薪前,“玉大人润努,你說我怎么就攤上這事∈纠ǎ” “怎么了铺浇?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垛膝。 經(jīng)常有香客問我鳍侣,道長,這世上最難降的妖魔是什么吼拥? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任倚聚,我火速辦了婚禮,結(jié)果婚禮上扔罪,老公的妹妹穿的比我還像新娘秉沼。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布唬复。 她就那樣靜靜地躺著矗积,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敞咧。 梳的紋絲不亂的頭發(fā)上棘捣,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音休建,去河邊找鬼乍恐。 笑死,一個胖子當著我的面吹牛测砂,可吹牛的內(nèi)容都是我干的茵烈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼砌些,長吁一口氣:“原來是場噩夢啊……” “哼呜投!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起存璃,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤仑荐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵东,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘招,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年偎球,在試婚紗的時候發(fā)現(xiàn)自己被綠了洒扎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甜橱,死狀恐怖逊笆,靈堂內(nèi)的尸體忽然破棺而出栈戳,到底是詐尸還是另有隱情岂傲,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布子檀,位于F島的核電站镊掖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褂痰。R本人自食惡果不足惜亩进,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩歪。 院中可真熱鬧归薛,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至千元,卻和暖如春苫昌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幸海。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工祟身, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人物独。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓袜硫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挡篓。 傳聞我的和親對象是個殘疾皇子父款,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)瞻凤,斷路器憨攒,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)阀参、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)肝集、lso...
    北辰青閱讀 9,423評論 0 11
  • 基于 TCP 的套接字編程的所有客戶端和服務器端都是從調(diào)用socket 開始,它返回一個套接字描述符蛛壳⌒诱埃客戶端隨后調(diào)...
    我是強強閱讀 408評論 0 0
  • 好久沒寫,呼市一行衙荐,看著姐姐們的姿態(tài)捞挥,我在想,一個女人去選擇過自己喜歡的生活是一件小確幸的事情忧吟,可現(xiàn)實是很多時候砌函,...
    music_lei溯鯤閱讀 298評論 0 1
  • 以前啊,那是初中高中的時候了溜族,那也是寫文章自夸自賣的一個好時光讹俊,說時遲那時快,大學都要畢業(yè)了煌抒,不想被剁肉兄撩起...
    度圈閱讀 223評論 0 0