DEVC++_C語言_網(wǎng)絡初級編程源碼_第1頁
DEVC++_C語言_網(wǎng)絡初級編程源碼_第2頁
DEVC++_C語言_網(wǎng)絡初級編程源碼_第3頁
DEVC++_C語言_網(wǎng)絡初級編程源碼_第4頁
DEVC++_C語言_網(wǎng)絡初級編程源碼_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、服務端:/*2015.11.03 內(nèi)容:網(wǎng)上下到的C語言網(wǎng)絡編程源代碼 編譯運行通過。*/ #include <WINSOCK2.H> #include <STDIO.H> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv) /初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0) return 0; /以上其實 就是調(diào)用了WSAst

2、artup()函數(shù)。其他語句都是給它設定參數(shù)。 /* MAKEWORD 宏 平臺:SDK這個宏創(chuàng)建一個無符號16位整形,通過連接兩個給定的無符號參數(shù)。(注:typedef unsigned short WORD;)函數(shù)原型 編輯 WORD MAKEWORD( BYTE bLow, /指定新變量的低字節(jié)序; BYTE bHigh /指定新變量的高字節(jié)序; ); typedef struct WSAData WORDwVersion;WORDwHighVersion;#ifdef _WIN64unsigned shortiMaxSockets;unsigned shortiMaxUdpDg;cha

3、r*lpVendorInfo;charszDescriptionWSADESCRIPTION_LEN+1;charszSystemStatusWSASYS_STATUS_LEN+1;#elsecharszDescriptionWSADESCRIPTION_LEN+1;charszSystemStatusWSASYS_STATUS_LEN+1;unsigned shortiMaxSockets;unsigned shortiMaxUdpDg;char*lpVendorInfo;#endif WSADATA, *LPWSADATA;WINSOCK_API_LINKAGE int WSAAPI WS

4、AStartup(WORD wVersionRequested,LPWSADATA lpWSAData); 為了在應用程序當中調(diào)用任何一個Winsock API函數(shù),首先第一件事情就是必須通過WSAStartup函數(shù)完成對Winsock服務的初始化, 因此需要調(diào)用WSAStartup函數(shù)。使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。該函數(shù)的第一個參數(shù)指明程序請 求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二個參數(shù)返回請求的Socket的版本信息。 當一個應用程序調(diào)用WSAStartup函數(shù)時,操作系統(tǒng)根據(jù)請求的Socke

5、t版本來搜索相應的Socket庫,然后綁定找到的Socket庫到該 應用程序中。以后應用程序就可以調(diào)用所請求的Socket庫中的其它Socket函數(shù)了。*/ /創(chuàng)建一個套接口()。 SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); / #define AF_INET 2 if(sclient = INVALID_SOCKET) printf("invalid socket !"); return 0; /* socket()函數(shù)用于根據(jù)指定的地址族、數(shù)據(jù)類型和協(xié)議來分配一個套接口的描述字及其所用的資源。如

6、果協(xié)議protocol未指定(等于0),則使用缺省的連接方式。對于使用一給定地址族的某一特定套接口,只支持一種協(xié)議。但地址族可設為AF_UNSPEC(未指定),這樣的話協(xié)議參數(shù)就要指定了。協(xié)議號特定于進行通訊的“通訊域”。 #include <winsock.h>SOCKET PASCAL FAR socket( int af, int type, int protocol);af:一個地址描述。目前僅支持AF_INET格式,也就是說ARPA Internet地址格式。type:指定socket類型。新套接口的類型描述類型,如TCP(SOCK_STREAM)和UDP(SOCK_DG

7、RAM)。常用的socket類型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。protocol:顧名思義,就是指定協(xié)議。套接口所用的協(xié)議。如調(diào)用者不想指定,可用0。常用的協(xié)議有,IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,它們分別對應TCP傳輸協(xié)議、UDP傳輸協(xié)議、STCP傳輸協(xié)議、TIPC傳輸協(xié)議。 類型 解釋 SOCK_STREAM 提供有序的、可靠的、雙向的和基于連接的字節(jié)流,使用帶外數(shù)據(jù)傳送機制,為Internet地址族使用TCP。 SOCK_DGR

8、AM 支持無連接的、不可靠的和使用固定大?。ㄍǔ:苄。┚彌_區(qū)的數(shù)據(jù)報服務,為Internet地址族使用UDP。 SOCK_STREAM類型的套接口為全雙向的字節(jié)流。對于流類套接口,在接收或發(fā)送數(shù)據(jù)前必需處于已連接狀態(tài)。用connect()調(diào)用建立與另一套接口的連接, 接成功后,即可用send()和recv()傳送數(shù)據(jù)。當會話結束后,調(diào)用closesocket()。帶外數(shù)據(jù)根據(jù)規(guī)定用send()和recv()來接收。 實SOCK_STREAM類型套接口的通訊協(xié)議保證數(shù)據(jù)不會丟失也不會重復。如果終端協(xié)議有緩沖區(qū)空間,且數(shù)據(jù)不能在一定時間成功發(fā)送,則認為連接中斷, 其后續(xù)的調(diào)用也將以WSAETIME

9、OUT錯誤返回。 SOCK_DGRAM類型套接口允許使用sendto()和recvfrom()從任意端口發(fā)送或接收數(shù)據(jù)報。如果這樣一個套接口用connect()與一個指定端口連接,則可用 send()和recv()與該端口進行數(shù)據(jù)報的發(fā)送與接收。 */ sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(8888); / u_short PASCAL FAR htons( u_short hostshort); 將主機的無符號短整形數(shù)轉換成網(wǎng)絡字節(jié)順序。hostshort:主機字節(jié)順序表達的16

10、位數(shù)。 serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); /inet_addr()的功能是將一個點分十進制的IP轉換成一個長整數(shù)型數(shù)(u_long類型 /結構體中的結構體。 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr) = SOCKET_ERROR) printf("connect error !"); closesocket(sclient); return 0; /* struct sockaddr_in sho

11、rtsin_family;u_shortsin_port;struct in_addrsin_addr;charsin_zero8; ; typedef struct in_addr union struct u_char s_b1, s_b2, s_b3, s_b4; S_un_b; struct u_short s_w1, s_w2; S_un_w; u_long S_addr; S_un; IN_ADDR, *PIN_ADDR, *LPIN_ADDR; struct sockaddr_in shortsin_family;u_shortsin_port;struct in_addrsin

12、_addr;charsin_zero8; ; htons(8888);將主機的無符號短整形數(shù)轉換成網(wǎng)絡字節(jié)順序。#include <winsock.h>u_short PASCAL FAR htons( u_short hostshort);hostshort:主機字節(jié)順序表達的16位數(shù)。簡單地說,htons()就是將一個數(shù)的高低位互換(如:12 34 -> 34 12)VB表示:MsgBox Hex(htons(&H1234)顯示值為 3412=htons() host to network shorthtonl() host to network longntoh

13、l() network to host longntohs() network to host shortconnect()用于建立與指定socket的連接。頭文件: #include <winsock.h>函數(shù)原型: int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR* name, int namelen);參數(shù):s:標識一個未連接socketname:指向要連接套接字的sockaddr結構體的指針namelen:sockaddr結構體的字節(jié)長度本函數(shù)用于創(chuàng)建與指定外部端口的連接。s參數(shù)指定一個未連接的數(shù)據(jù)報或流

14、類套接口。如套接口未被捆綁,則系統(tǒng)賦給本地關聯(lián)一個唯一的值,且設置套接口為已捆綁。請注意若名字結構中的地址域為全零的話,則connect()將返回WSAEADDRNOTAVAIL錯誤。對于流類套接口(SOCK_STREAM類型),利用名字來與一個遠程主機建立連接,一旦套接口調(diào)用成功返回,它就能收發(fā)數(shù)據(jù)了。對于數(shù)據(jù)報類套接口(SOCK_DGRAM類型),則設置成一個缺省的目的地址,并用它來進行后續(xù)的send()與recv()調(diào)用。 */ int aaa=0; char sendData255 ;for(int aa=0;aa<10;aa+)if(aa=0) /輸出提示 printf(&qu

15、ot;connect successful!ninput what you want to deliver to server:n"); aaa=0;char bb=0; while(bb!='n') bb=getchar(); sendDataaaa=bb; aaa+; aaa+; sendDataaaa='n' sendDataaaa+1=0; send(sclient, sendData, sizeof(sendData), 0); for(aaa=0;aaa<254;)/用來將緩沖數(shù)組清零。 sendDataaaa=0; aaa+; ch

16、ar recData255; int ret = recv(sclient, recData, 255, 0);/ 本函數(shù)用于已連接的數(shù)據(jù)報或流式套接口進行數(shù)據(jù)的接收。 if(ret > 0) recDataret = 0x00; printf(recData); /* send(): 向一個已連接的套接口發(fā)送數(shù)據(jù)。#include <winsock.h>int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);s:一個用于標識已連接套接口的描述字。buf:包含待發(fā)送數(shù)據(jù)的緩沖區(qū)。len:緩

17、沖區(qū)中數(shù)據(jù)的長度。flags:調(diào)用執(zhí)行方式。send()適用于已連接的數(shù)據(jù)包或流式套接口發(fā)送數(shù)據(jù)。對于數(shù)據(jù)報類套接口,必需注意發(fā)送數(shù)據(jù)長度不應超過通訊子網(wǎng)的IP包最大長度。IP包最大長度在WSAStartup()調(diào)用返回的WSAData的iMaxUdpDg元素中。如果數(shù)據(jù)太長無法自動通過下層協(xié)議,則返回WSAEMSGSIZE錯誤,數(shù)據(jù)不會被發(fā)送。請注意成功地完成send()調(diào)用并不意味著數(shù)據(jù)傳送到達。如果傳送系統(tǒng)的緩沖區(qū)空間不夠保存需傳送的數(shù)據(jù),除非套接口處于非阻塞I/O方式,否則send()將阻塞。對于非阻塞SOCK_STREAM類型的套接口,實際寫的數(shù)據(jù)數(shù)目可能在1到所需大小之間,其值取決

18、于本地和遠端主機的緩沖區(qū)大小??捎胹elect()調(diào)用來確定何時能夠進一步發(fā)送數(shù)據(jù)。在相關套接口的選項之上,還可通過標志位flag來影響函數(shù)的執(zhí)行方式。也就是說,本函數(shù)的語義既取決于套接口的選項也取決于標志位。后者由以下一些值組成 */ char recData255; int ret = recv(sclient, recData, 255, 0);/ 本函數(shù)用于已連接的數(shù)據(jù)報或流式套接口進行數(shù)據(jù)的接收。 if(ret > 0) recDataret = 0x00; printf(recData); /* recv()是編程語言函數(shù)。函數(shù)原型int recv( _In_ SOCKET

19、s, _Out_ char *buf, _In_ int len, _In_ int flags); 這里只描述同步Socket的recv函數(shù)的執(zhí)行流程。當應用程序調(diào)用recv函數(shù)時:(1)recv先等待s的發(fā)送緩沖中的數(shù)據(jù)被協(xié)議傳送完畢,如果協(xié)議在傳送s的發(fā)送緩沖中的數(shù)據(jù)時出現(xiàn)網(wǎng)絡錯誤,那么recv函數(shù)返回SOCKET_ERROR;(2)如果s的發(fā)送緩沖中沒有數(shù)據(jù)或者數(shù)據(jù)被協(xié)議成功發(fā)送完畢后,recv先檢查套接字s的接收緩沖區(qū),如果s接收緩沖區(qū)中沒有數(shù)據(jù)或者協(xié)議正在接收數(shù)據(jù),那么recv就一直等待,直到協(xié)議把數(shù)據(jù)接收完畢。當協(xié)議把數(shù)據(jù)接收完畢,recv函數(shù)就把s的接收緩沖中的數(shù)據(jù)copy到b

20、uf中(注意協(xié)議接收到的數(shù)據(jù)可能大于buf的長度,所以在這種情況下要調(diào)用幾次recv函數(shù)才能把s的接收緩沖中的數(shù)據(jù)copy完。recv函數(shù)僅僅是copy數(shù)據(jù),真正的接收數(shù)據(jù)是協(xié)議來完成的);recv函數(shù)返回其實際copy的字節(jié)數(shù)。如果recv在copy時出錯,那么它返回SOCKET_ERROR;如果recv函數(shù)在等待協(xié)議接收數(shù)據(jù)時網(wǎng)絡中斷了,那么它返回0。注意:在Unix系統(tǒng)下,如果recv函數(shù)在等待協(xié)議接收數(shù)據(jù)時網(wǎng)絡斷開了,那么調(diào)用recv的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。 */ closesocket(sclient); WSACleanup();/W

21、SACleanup()的功能是 終止Winsock 2 DLL (Ws2_32.dll) 的使用. getchar(); return 0; 客戶端:#include <stdio.h>#include <winsock.h>#pragma comment(lib,"ws2_32.lib")/*undefined reference to _imp_WSAStartup 錯誤信息及解決辦法 */ int main(int argc, char* argv) /初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADA

22、TA wsaData; if(WSAStartup(sockVersion, &wsaData)!=0) return 0; /創(chuàng)建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(slisten = INVALID_SOCKET) printf("socket error !"); return 0; /綁定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin) = SOCKET_ER

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論