資源描述:
《用c語(yǔ)言編寫socket程序》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、用C語(yǔ)言編寫Socket程序本文的目的在于為初學(xué)者提供一個(gè)快速的入門指導(dǎo),用來(lái)迅速熟悉用C語(yǔ)言來(lái)編寫Internet網(wǎng)絡(luò)應(yīng)用程序。本文假設(shè)讀者已經(jīng)具備了C語(yǔ)言的基本知識(shí)和語(yǔ)法,并且讀者有使用Uinx/Linux的經(jīng)驗(yàn)。盡管Uinx/Linux的Socket編程與在Windows下的有一些不同的地方,但是在此我并不想展開。另外,本文所有的程序都在RedHat5.2下編譯通過(guò),并且在glibc2.0.7和libc5.3.12兩種環(huán)境下都沒(méi)有問(wèn)題?,F(xiàn)在就開始我們的教程吧:)。對(duì)一個(gè)程序員而言,sockets和底層的文件描述符非常類似(可以在sockets里使用read()和write(
2、)函數(shù)),盡管建立一個(gè)socket比打開,讀取和寫入一個(gè)文件更為麻煩,但這是由于網(wǎng)絡(luò)連接比單純的本地硬盤的讀寫復(fù)雜的多所造成的。通常,sockets用來(lái)實(shí)現(xiàn)客戶機(jī)/服務(wù)器對(duì)。服務(wù)器的任務(wù)是監(jiān)聽某個(gè)特定的端口,當(dāng)接收到客戶端的服務(wù)請(qǐng)求時(shí)完成相應(yīng)的服務(wù);客戶機(jī)的任務(wù)是請(qǐng)求服務(wù)器完成事先設(shè)定好的服務(wù)。作為入門級(jí)的文章,我們?cè)谶@里不會(huì)使用所有的socket類型和功能,但是我們會(huì)向讀者提供足夠的信息?,F(xiàn)在,就讓我們開始吧。=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=建立一個(gè)soc
3、ket:socket()你所要學(xué)的socket編程的第一件事就是用socket()建立一個(gè)socket:--------#include#includeintsocket(intaf,inttype,intprotocol)-------'intaf'代表地址族或者稱為socket所代表的域,通常有兩個(gè)選項(xiàng):????AF_UNIX-只在單機(jī)上使用。????AF_INET-可以在單機(jī)或其他使用DARPA協(xié)議(UDP/TCP/IP)的異種機(jī)通信。'inttype'代表你所使用的連接類型,通常也有兩種情況:????SOCK_STRE
4、AM-用來(lái)建立面向連接的sockets,可以進(jìn)行可靠無(wú)誤的的數(shù)據(jù)傳輸????SOCK_DGRAM-用來(lái)建立沒(méi)有連接的sockets,不能保證數(shù)據(jù)傳輸?shù)目煽啃浴T诒疚闹?,我們著重使用AF_INET地址族和SOCK_STREAM連接類型。'intprotocol'通常設(shè)定為0。這樣的目的是使系統(tǒng)選擇默認(rèn)的由協(xié)議族和連接類型所確定的協(xié)議。這個(gè)函數(shù)的返回值是一個(gè)文件描述句柄,如果在此期間發(fā)生錯(cuò)誤則返回-1并且設(shè)定了相應(yīng)的errno。-------#include#includeintsockfd/*soontobesocketfile
5、descriptor*/sockfd=socket(AF_INET,SOCK_STREAM,0)/*errorcheckinghere*/-------如果執(zhí)行成功,我們就擁有了一個(gè)socket的文件句柄,通過(guò)這個(gè)句柄就可以訪問(wèn)Internet了。=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=名字綁定socket:bind()下一步要完成的就是名字綁定工作了:-------#include#includeintbind
6、(intsockfd,structsockaddr*name,intnamelen)-------在這個(gè)函數(shù)里,sockfd是從socket()調(diào)用得到的文件描述句柄。name是一個(gè)指向sockaddr類型結(jié)構(gòu)的一個(gè)指針。如果地址族被設(shè)定為AF_UNIX,這個(gè)類型的定義是如下所示:-------structsockaddr{u_shortsa_family;charsa_data[14];};-------在這個(gè)結(jié)構(gòu)種,name.sa_family應(yīng)當(dāng)被設(shè)定為AF_UNIX。name.sa_data應(yīng)當(dāng)包含最長(zhǎng)為14個(gè)字節(jié)的文件名,這個(gè)文件名用來(lái)分配給socket。namelen
7、給出了文件名的具體長(zhǎng)度。-------#include#includestructsockaddrname;intsockfd;name.sa_family=AF_UNIX;strcpy(name.sa_data,"/tmp/whatever");sockfd=socket(AF_UNIX,SOCK_STREAM,0)/*errorcheckingcodehere*/bind(sockfd,&name,strlen(name.