Microsoft Word - Winsock網路程式設計.doc
|
|
- 刃徐 郎
- 6 years ago
- Views:
Transcription
1 網路程式設計 (WinSock) 一 簡介 個人電腦及微軟視窗已經非常普遍, 加上利用電腦網路的種種好處, 有不少廠商在這樣的環境下開發一些給使用者使用的軟體 ( 如 Telnet FTP News Mail 等等 ) 或是提供網路發展環境給使用者來開發其網路軟體 但是早期發展時, 由於沒有共同的標準介面, 所以各家廠商均各自發展其環境系統及應用軟體 ; 使用者在購買了這樣的一套系統之後, 不論是使用其應用軟體或是在上面開發自己的程式都必須受限於這家廠商了, 因為彼此的系統開發工具 (SDK,System Development Kid) 的應用程式介面 (API, Application Interface) 並不相同, 所以開發出來的應用程式也無法在不同廠商的系統上執行 ; 如果該廠商沒有進一步提供技術支援 發展新的軟體或是連絡不便, 甚或不幸倒閉了, 那將是一件很令人頭痛的事 1
2 有鑑於此, 於是由各公司組成的一群有志之士 ( 包括 Microsoft Sun Microsystems HP Informix Novell 3Com... 等等 ) 開始著手於整合定義出一套微軟視窗環境下的標準 TCP/IP 網路開發介面, 並利用微軟視窗環境下 動態連結程式庫 (DLL, Dynamic Link Library) 的特性, 以便讓提供網路發展環境的廠商及開發網路應用程式的公司能夠各自分開發展而彼此不受限 ; 換句話說, 也就是你若遵循此一標準介面所開發出來的網路軟體應該可以在各家不同的環境上執行, 而發展這些微軟視窗下 TCP/IP 網路環境的廠商亦須遵照此一標準提供符合這些介面的各項函式功能 ; 這樣使用者就可以不受限地選擇不同廠商的軟體或是在不同家的系統環境上執行同一個自己開發的網路軟體了, 甚至不必再經過修改 編譯等煩瑣的程序, 真的是給使用者及開發者很大的方便 這個標準的微軟視窗 TCP/IP 網路開發介面稱之為 Windows Sockets ( 簡稱 Winsock ), 是以 UNIX 系統上 Berkeley Sockets 的函式為基礎, 並加上了一些符合視窗環境 訊息驅動 (Message driven) 特性的函式 目前的版本有 1993 年 1 月所定出的 1.1 版與 1995 年定義的 2.0 版 它總共定義了 46 個函式 ( 參見表一 ), 包括了 30 個 BSD 函式 ( 名稱 參數 回返值都和 UNIX 的 BSD 函 2
3 式相同 ), 及 16 個視窗特性的函式 (WSA 開頭的函式 ) Winsock 1.1 定義中並明白地表示提供此一網路開發環境的廠商一定要提供 Stream socket (TCP) 及 Datagram socket (UDP) 的功能 這些 API 介面適用於 Internet Protocol Suite (IPS, 通常稱之為 TCP/IP), 支援 Stream (TCP) 及 Datagram (UDP) Socket Stream (TCP) Socket 提供 雙向 可靠 有次序 不重覆 之資料傳送 Datagram (UDP) Socket 則提供 雙向 之溝通, 但沒有 可靠 有次序 不重覆 等之保證 ; 所以使用者可能會收到無次序 重覆之資料, 甚至資料在傳輸過程中也可能會遺漏 ( 表一 )( 函式說明於附錄中 ) BSD 函式 accept() bind() closesocket() connect() getpeername() getsockname() getsockopt() htonl() htons() inet_addr() inet_ntoa() ioctlsocket() listen() ntohl() ntohs() recv() recvfrom() select() send() sendto() setsockopt() shutdown() socket() gethostname() gethostbyaddr() gethostbyname() getprotobyname() getprotobynumber() getservbyname() getservbyport() 視窗特性函式 WSAAsyncGetHostByAddr() WSAAsyncGetProtoByName() WSAAsyncGetServByName() WSAAsyncSelect() WSACancelBlockingCall() WSAGetLastError() WSAAsyncGetHostByName() WSAAsyncGetProtoByNumber() WSAAsyncGetServByPort() WSACancelAsyncRequest() WSACleanup() WSAIsBlocking() 3
4 WSASetBlockingHook() WSAStartup() WSASetLastError() WSAUnhookBlockingHook() 二 連續 (sequential) 與同時 (concurrent) 處理 例子 : 一個印出從 1 到 5 的整數與總和的 C 程式 (a) 連續處理 #include <stdlib.h> #include <stdio.h> #include <process.h> int addem(int); int main(int argc, char *argv[]) { addem(5); return 0; int addem(int count) { int i, sum; sum = 0; for (i=0; i<=count; ++i) { printf("the value of i is %d\n", i); fflush(stdout); sum += i; printf("the sum is %d\n", sum); fflush(stdout); return 0; 4
5 執行結果 => (b) 同時處理 #include <stdlib.h> #include <stdio.h> #include <process.h> int addem(int); int main(int argc, char *argv[]) { /*_beginthread() 產生一個新的 thread, 並讓原本的 thread 繼續執行下一行指令 ; 而新的 thread 執行當作 _beginthread 引數 (argument) 的函數 */ _beginthread((void (*)(void *))addem, 0, (void *)5); addem(5); return 0; 執行函式 函式的引數 int addem(int count) { int i, sum; sum = 0; for (i=0; i<=count; ++i) { printf("the value of i is %d\n", i); fflush(stdout); sum += i; printf("the sum is %d\n", sum); fflush(stdout); return 0; 執行結果 => 5
6 三 WinSock Application Programming Interface (API) (a) 架構 Windows 95 與 Windows NT 使用 Dynamic Linked Library---DLL, 來執行 WinSock API 當需要時才載入記憶體, 所有用到 WinSock 的程式共享一份 DLL 6
7 (b) Socket 的資料結構 使用一個 socket 描述子來表示某一個 socket 每一個處理有一個 socket 描述表 (c) 被動與主動 socket 伺服器 (Server) 所用的 socket, 等著收到新的連線 (connection), 稱為被動 (passive)socket; 而用戶端 (client) 用來啟動連線建立的 socket, 稱為主動 (active)socket (d) 位址家族與指定端點位址 位址家族 :AF_INET (TCP/IP 用 ) 端點位址 : 包含一個 IP 位址與協定埠 (port) 號碼 * 最一般化的結構 struct sockaddr { u_short sa_family; char sa_data[14]; ; *TCP/IP 所用的結構 struct sockaddr_in { u_short sin_family; /* AF_INET */ u_short sin_port; /* 協定埠 (port) 號碼 */ struct in_addr sin_addr; /* IP 位址 */ char sin_zero[8]; /* 未用, 設成 0*/ ; 7
8 (e) Socket API 的函式 - WSAStartup(): 第一個使用的函式 - WSACleanup(): 最後一個使用的函式 - socket(): 建立一個 socket, 傳回一個 socket 描述子 - bind(): 伺服器使用 bind() 來指定本身的端點位址 - listen(): 連接導向 (connection-oriented) 伺服器使用 listen(), 使得 socket 成為被動模式, 以接受新來的連結 - accept(): 伺服器使用 accept 來取得下一個連線要求 產生一個新的 socket, 用來傳送連線的資料 ; 原本的 socket 繼續接受新的連線要求 - connect(): 用戶端用來建立一條到遠端伺服器的連線 - send(): 用戶端或伺服器在 TCP 連線或 UDP socket 上送資料 (blocking call) - sendto(): 將一個資料段 (datagram) 送到一個指定的端點 - recv(): 用戶端或伺服器在 TCP 連線或 UDP socket 上收資料 - recvfrom(): 收取下一個進來的資料段, 並記錄傳送端的位址 - shutdown(): 單或雙向的關閉一個 TCP 的連結 - closesocket(): 關閉一個 socket - htons(), htonl(): 將本機的位元順序轉換成為網路上傳送的位元順序 ( 最顯著位元優先 ) 分為 16(short) 與 32(long) 位元兩種 - ntohs(), ntohl(): 將網路上傳送的位元順序轉換成為本機的位元順序 8
9 (f) 使用 socket API 的順序 (g) 使用 WinSock 定義的常數 #include <winsock.h> 四 用戶端的作法 (a) 如何取得伺服器的 IP 位址與協定埠號碼 1. 在程式中指定 : 簡單 但是伺服器不能改變位置 2. 程式執行時, 由使用者輸入 : 最常用的方式 3. 由檔案或硬碟中取得 : 需要每部機器都有這個檔案 4. 使用特殊協定去找到伺服器 : 只能是適於較小而簡單的網路環境, 增加額外的資料傳送 (b) 尋找 Domain Name 9
10 兩種位址表示法 : 1. Domain Name: 如 dec8.ncue.edu.tw 2. 點十進位 IP 位址 : 如 需要將這兩種位址表示法轉換成為 sockaddr_in 結構中所需填入的二進位 32 位元 的 IP 位址 1. inet_addr(): 將點十進位 IP 位址的字串轉換成為二進位的 IP 位址 2. gethostbyname(): 將機器 Domain Name 的字串傳入, 取得一個含有二進位 IP 位址的 hostent 結構的位址 ( 網路表示法 ) struct hostent { char FAR * h_name; /* 正式機器名稱 */ char FAR * FAR * h_aliases; /* 別名 */ short h_addrtype; /* 位址型態 */ short h_length; /* 位址長度 */ char FAR * FAR * h_addr_list; /* 位址列表 */ #define h_addr h_addr_list[0] /* 位址列表的第一個 */ 用戶端呼叫 : struct hostent *hptr; char *examplenam = dec8.cyut.edu.tw ; if (hptr = gethostbyname( examplenam) ) { /* IP 位址現在在 hptr->h_addr */ else { /* error! 傳回 NULL */ /* 處理的程式 */ (c) 由名稱尋找 well-known 埠 getservbyname(): 公認的服務已經指定有公認 (well-known) 的協定埠 要使用他們, 需先取得埠的號碼 傳回一個只到 servent 結構的指標 struct servent { char FAR * s_name; /* 正式服務名稱 */ char FAR * FAR * s_aliases; /* 別名 */ short s_port; /* 這個服務的埠 */ char FAR * s_proto; /* 使用的協定 */ 10
11 使用 SMTP 協定的 TCP 用戶端 : struct servent *sptr; if (sptr = getservbyname( smtp, tcp )) { /* 埠號碼在 sptr->s_port */ else { /* error! 傳回 NULL */ /* 處理的程式 */ (d) 由名稱尋找協定 getprotobyname(): 由一個協定名稱取得相對應的整數常數 傳回一個指到 protoent 結構的位址 struct protoent { char FAR * p_name; /* 正式協定名稱 */ char FAR * FAR * p_aliases; /* 別名 */ short p_proto; /* 正式協定號碼 */ 用戶端尋找 UDP 的正式協定號碼 : struct protoent *pptr; if (pptr = getprotobyname( udp )) { /* 協定號碼在 pptr->p_proto */ else { /* error! 傳回 NULL */ /* 處理的程式 */ (e) TCP 用戶端演算法 1. 找到伺服器的 IP 位址與協定埠號碼 2. 配置 socket #include <winsock.h> 11
12 SOCKET s; /* 使用 TCP, 需要指明協定家族 :PF_INET; 服務 :SOCK_STREAM; 傳回 socket 描述子 */ s = socket(pf_inet, SOCK_STREAM, 0); 3. 指明這個 TCP 連結需要選擇一個本機上尚未使用 任意的埠 4. 連接 socket 到伺服器 /* s :socket 描述子 ; remaddr: 表示遠端位址的 sockaddr_in 結構位址 ; remaddrlen:remaddr 的長度 直到 TCP 連結建立成功, 才會傳回 0 ; 或是失敗 */ retcode = connect(s, remaddr, remaddrlen) 5. 應用程式透過 socket 與伺服器通訊 注意 :TCP 並不保留傳送資料的分界, 而是將資料連接在一起 可以保證將資料送出, 但接收端可能需要收好幾次, 才能收滿送出的資料 #define BLEN 120 char *req = request of some sort ; char buf[blen]; char *bptr; int n; int buflen; bptr = buf; buflen = BLEN; /* send request */ send(s, req, strlen(req), 0); /* read response ( 可能有許多次 ) */ n = recv(s, bptr, buflen, 0); while (n!= SOCKET_ERROR && n!= 0) { bptr += n; buflen -= n; n = recv(s, bptr, buflen, 0); 12
13 結束這個連結 注意 :TCP 允許雙向通訊, 有時並不知何時會送出或收到最後的資料, 所以可以用 shutdown() 來停止某一個方向的連接 當用戶端沒有資料要送了, 他可以用 shutdown(), 底下的協定會送一個 end-of-file 訊號, 通知伺服器端 所以當伺服器端送完最後一個回應後, 就可以關掉連接 /* direction = 0 : no input; = 1 : no output; = 2 : no input/output */ errcode = shutdown(s, direction) 範例 : /* contcp.cpp - connecttcp */ #include <winsock.h> SOCKET connectsock(const char *, const char *, const char *); /* * connecttcp - connect to a specified TCP service on a specified host * */ SOCKET connecttcp(const char *host, const char *service ) { return connectsock( host, service, "tcp"); ***************************************************************** /* consock.cpp - connectsock */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <winsock.h> #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif /* INADDR_NONE */ 13
14 void errexit(const char *,...); /* * connectsock - allocate & connect a socket using TCP or UDP * */ SOCKET connectsock(const char *host, const char *service, const char *transport ) { struct hostent *phe; /* pointer to host information entry */ struct servent *pse; /* pointer to service information entry */ struct protoent *ppe; /* pointer to protocol information entry*/ struct sockaddr_in sin; /* an Internet endpoint address */ int s, type; /* socket descriptor and socket type */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; /* Map service name to port number */ if ( pse = getservbyname(service, transport) ) sin.sin_port = pse->s_port; else if ( (sin.sin_port = htons((u_short)atoi(service))) == 0 ) errexit("can't get \"%s\" service entry\n", service); /* Map host name to IP address, allowing for dotted decimal */ if ( phe = gethostbyname(host) ) memcpy(&sin.sin_addr, phe->h_addr, phe->h_length); else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) errexit("can't get \"%s\" host entry\n", host); /* Map protocol name to protocol number */ if ( (ppe = getprotobyname(transport)) == 0) errexit("can't get \"%s\" protocol entry\n", transport); /* Use protocol to choose a socket type */ if (strcmp(transport, "udp") == 0) type = SOCK_DGRAM; else 14
15 type = SOCK_STREAM; /* Allocate a socket */ s = socket(pf_inet, type, ppe->p_proto); if (s == INVALID_SOCKET) errexit("can't create socket: %d\n", GetLastError()); /* Connect the socket */ if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) errexit("can't connect to %s.%s: %d\n", host, service, GetLastError()); return s; ******************************************************************** /* errexit.cpp - errexit */ #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <winsock.h> /* * errexit - print an error message and exit * */ /*VARARGS1*/ void errexit(const char *format,...) { va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); WSACleanup(); exit(1); 15
16 ******************************************************************** [DAYTIME 的服務 ] 用戶端連上 DAYTIME 伺服器, 取得伺服器的日期與時間 格式可以如 : 星期幾, 幾月幾號, 年份時間 - 時區 (Thursday, February 22, :37:43-EST) 可以使用 TCP 或 UDP, 都用埠 13 (TCP 版本 ): 當伺服器收到一個新的連結, 他將會取得當時的日期與時間的字串, 送回給用戶端, 然後結束連結 用戶不需送任何需求 /* TCPdtc.cpp - main, TCPdaytime */ #include <stdlib.h> #include <stdio.h> #include <winsock.h> void TCPdaytime(const char *, const char *); void errexit(const char *,...); SOCKET connecttcp(const char *, const char *); #define LINELEN 128 #define WSVERS MAKEWORD(2, 0) /* * main - TCP client for DAYTIME service * */ int main(int argc, char *argv[]) { char *host = "localhost";/* host to use if none supplied*/ char *service = "daytime"; /* default service port */ WSADATA wsadata; switch (argc) { case 1: host = "localhost"; break; 16
17 case 3: service = argv[2]; /* FALL THROUGH */ case 2: host = argv[1]; break; default: fprintf(stderr, "usage: TCPdaytime [host [port]]\n"); exit(1); if (WSAStartup(WSVERS, &wsadata)!= 0) errexit("wsastartup failed\n"); TCPdaytime(host, service); WSACleanup(); return 0; /* exit */ /* * TCPdaytime - invoke Daytime on specified host and print results * */ void TCPdaytime(const char *host, const char *service) { char buf[linelen+1]; /* buffer for one line of text */ SOCKET s; /* socket descriptor */ int cc; /* recv character count */ s = connecttcp(host, service); cc = recv(s, buf, LINELEN, 0); while( cc!= SOCKET_ERROR && cc > 0) { buf[cc] = '\0'; /* ensure null-termination */ (void) fputs(buf, stdout); cc = recv(s, buf, LINELEN, 0); closesocket(s); 17
18 (UDP 版本 ): 用戶端需要送一個需求, 包含隨意的資料段 當伺服器收到這個資料段, 他會將日期與時間的字串送回用戶端 ******************************************************************** [ECHO 的服務 ]: 伺服器只傳回所有由用戶端所收到的資料 (TCP 版本 ): /* TCPecho.cpp - main, TCPecho */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <winsock.h> void TCPecho(const char *, const char *); void errexit(const char *,...); SOCKET connecttcp(const char *, const char *); #define LINELEN 128 #define WSVERS MAKEWORD(2, 0) /* * main - TCP client for ECHO service * */ void main(int argc, char *argv[]) { char *host = "localhost"; /* host to use if none supplied */ char *service = "echo"; /* default service name */ WSADATA wsadata; switch (argc) { case 1: host = "localhost"; 18
19 break; case 3: service = argv[2]; /* FALL THROUGH */ case 2: host = argv[1]; break; default: fprintf(stderr, "usage: TCPecho [host [port]]\n"); exit(1); if (WSAStartup(WSVERS, &wsadata)!= 0) errexit("wsastartup failed\n"); TCPecho(host, service); WSACleanup(); exit(0); /* * TCPecho - send input to ECHO service on specified host and print reply * */ void TCPecho(const char *host, const char *service) { char buf[linelen+1]; /* buffer for one line of text */ SOCKET s; /* socket descriptor */ int cc, outchars, inchars; /* characters counts */ s = connecttcp(host, service); while (fgets(buf, sizeof(buf), stdin)) { buf[linelen] = '\0'; /* ensure line null-termination */ outchars = strlen(buf); (void) send(s, buf, outchars, 0); /* read it back */ for (inchars = 0; inchars < outchars; inchars += cc) { 19
20 cc = recv(s, &buf[inchars], outchars-inchars, 0); if (cc == SOCKET_ERROR) errexit("socket recv failed: %d\n", GetLastError()); fputs(buf, stdout); closesocket(s); ******************************************************************** (f) UDP 用戶端演算法 1. 找到伺服器的 IP 位址與協定埠號碼 2. 配置 socket s = socket(pf_inet, SOCK_DGRAM, 0); 3. 指明這個 UDP 連結需要選擇一個本機上尚未使用 任意的埠 UDP 的用戶端有兩種模式 : ( 連接式 ): 使用 connect() 來指定遠端位址 之後就像 TCP 一樣收送資料 ( 未連接式 ): 不連接遠端的位址 每次送一個訊息, 就要指定遠端一次 4. 指出資料要送到的伺服器 5. 應用程式與伺服器通訊 注意 :UDP 的收送, 都是以一個訊息為單位, 不需呼叫多次 recv() 6. 結束這個連結 注意 : 呼叫 shutdown(), 只有做個紀錄, 並不送訊號到遠端 範例 : /* conudp.cpp - connectudp */ #include <winsock.h> SOCKET connectsock(const char *, const char *, const char *); /* * connectudp - connect to a specified UDP service on a specified host 20
21 * */ SOCKET connectudp(const char *host, const char *service ) { return connectsock(host, service, "udp"); [TIME 的服務 ] 用戶端連上 TIME 伺服器, 取得伺服器的日期與時間 伺服器轉換當地時間, 成為格林威治時間, 用戶端收到後, 再換成用戶端的時間, 以避免時區的不同 結果是一 32 位元的整數, 表示現在與 1900 年 1 月 1 日午夜的秒差 不是給人讀的, 而是給程式所用 可以使用 TCP 或 UDP, 都用埠 37 (TCP 版本 ): 當伺服器收到一個新的連結, 他將會取得當時時間的整數, 送回給用戶端, 然後結束連結 用戶不需送任何需求 (UDP 版本 ): 用戶端需要送一個需求, 包含一個隨意的資料段 當伺服器收到這個資料段, 他會取得傳送者的位址與埠號碼, 將時間的整數放在資料段中送回用戶端 /* UDPtime.cpp - main */ #include <stdlib.h> #include <stdio.h> #include <time.h> #include <winsock.h> #define BUFSIZE 64 #define WSVERS MAKEWORD(2, 0) #define WINEPOCH /* Windows epoch, in UCT secs */ #define MSG "what time is it?\n" SOCKET connectudp(const char *, const char *); void errexit(const char *,...); /* * main - UDP client for TIME service that prints the resulting time * */ 21
22 int main(int argc, char *argv[]) { char *host = "localhost";/* host to use if none supplied*/ char *service = "time"; /* default service name */ time_t now; /* 32-bit integer to hold time */ SOCKET s; /* socket descriptor */ int n; /* recv count */ WSADATA wsadata; switch (argc) { case 1: host = "localhost"; break; case 3: service = argv[2]; /* FALL THROUGH */ case 2: host = argv[1]; break; default: fprintf(stderr, "usage: UDPtime [host [port]]\n"); exit(1); if (WSAStartup(WSVERS, &wsadata)) errexit("wsastartup failed\n"); s = connectudp(host, service); (void) send(s, MSG, strlen(msg), 0); /* Read the time */ n = recv(s, (char *)&now, sizeof(now), 0); if (n == SOCKET_ERROR) errexit("recv failed: recv() error %d\n", GetLastError()); WSACleanup(); now = ntohl((u_long)now); /* put in host byte order */ 22
23 now -= WINEPOCH; /* convert UCT to Windows epoch */ printf("%s", ctime(&now)); /* ctime() 轉換成人們可以讀的格式 */ return 0; /* exit */ 注意 :Windows 是從 1970 年 1 月 1 日午夜開始計時 所以需要減掉與 1900 年 1 月 1 日午夜間的秒差 : 五 伺服器端的作法 (a) 反覆 (iterative) 與同時 (concurrent) 伺服器 1. 反覆伺服器 : 每次只能處理一個需求 => 設計簡單, 但是可能要等很久 2. 同時伺服器 : 可以一次處理好幾個需求 => 複雜, 但是效率較好! (b) 連接導向 (connection-oriented) 與無連接 (connectionless) 伺服器 1. 連接導向伺服器 : 使用 TCP( 可靠 ), 與每個用戶端都要建立一個連結 ( 使用一個 socket) 缺點是: 若沒有好好的處理, 連結會耗盡大量資源! 2. 無連接伺服器 : 使用 UDP( 不可靠 ), 可以用一個 socket 與多個用戶端通訊 不會耗盡資源, 適用於廣播 (broadcast) 群播(multicast) 的應用 缺點是 : 要應用程式處理 可靠性 的問題! 23
24 (c) 四種伺服器種類 1. 反覆 連接導向伺服器 (TCP) [ 演算法 ] 1) 建立一個 socket, 將他連結 (bind) 到所用服務的公開位址上 => socket(), bind() 注意 : 對於有多個介面 (IP 位址 ) 的伺服器, 使用 INADDR_ANY 常數, 取代一個特別的 IP 位址, 就可以從任何一個介面收取需求! 2) 將 socket 設成 被動 模式, 準備讓伺服器使用 => listen() 3) 從 socket 接收一個連結需求, 產生一個新的 socket 讓這個連結使用 => accept() 4) 根據應用程式, 重複從用戶端收取需求, 送回回應 => send(), recv() 5) 當某個用戶端結束了, 關閉與他的連結 回到第 3 步! 24
25 2. 反覆 非連接伺服器 (UDP) [ 演算法 ] 1) 建立一個 socket, 將他連結 (bind) 到所用服務的公開位址上 2) 根據應用程式, 重複從用戶端收取需求, 送回回應 /* s: socket; buf: 收到資料的緩衝區指標 ; len: 可用緩衝區長度 ; flags: 控制旗標 ; from: 指向傳送端點位置 sockaddr_in 的指標 ; fromlen: sockaddr_in 長度 */ retcode = recvfrom(s, buf, len, flags, from, fromlen); /* s: socket; message: 要送資料的緩衝區指標 ; len: 資料長度 ; flags: 控制旗標 ; toaddr: 指向目的地端點位置 sockaddr_in 的指標 ( 使用 recvfrom() 中的 from 指標 ); toaddrlen: sockaddr_in 長度 */ retcode = sendto(s, message, len, flags, toaddr, toaddrlen); 範例 : /* passudp.cpp - passiveudp */ #include <winsock.h> SOCKET passivesock(const char *, const char *, int); 25
26 /* * passiveudp - create a passive socket for use in a UDP server * */ SOCKET passiveudp(const char *service) { return passivesock(service, "udp", 0); ***************************************************************** /* passivesock() 的三個引數 : 服務名稱, 協定名稱, 所需連接需求 queue 長度 */ /* passsock.cpp - passivesock */ #include <stdlib.h> #include <string.h> #include <winsock.h> void errexit(const char *,...); u_short portbase = 0; /* port base, for test servers */ /* * passivesock - allocate & bind a server socket using TCP or UDP * */ SOCKET passivesock(const char *service, const char *transport, int qlen) { struct servent *pse; /* pointer to service information entry */ struct protoent *ppe; /* pointer to protocol information entry*/ struct sockaddr_in sin; /* an Internet endpoint address */ SOCKET s; /* socket descriptor */ int type;/* socket type (SOCK_STREAM, SOCK_DGRAM)*/ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; 26
27 /* Map service name to port number */ if ( pse = getservbyname(service, transport) ) sin.sin_port = htons(ntohs((u_short)pse->s_port) + portbase); else if ( (sin.sin_port = htons((u_short)atoi(service))) == 0 ) errexit("can't get \"%s\" service entry\n", service); /* Map protocol name to protocol number */ if ( (ppe = getprotobyname(transport)) == 0) errexit("can't get \"%s\" protocol entry\n", transport); /* Use protocol to choose a socket type */ if (strcmp(transport, "udp") == 0) type = SOCK_DGRAM; else type = SOCK_STREAM; /* Allocate a socket */ s = socket(pf_inet, type, ppe->p_proto); if (s == INVALID_SOCKET) errexit("can't create socket: %d\n", GetLastError()); /* Bind the socket */ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) errexit("can't bind to %s port: %d\n", service, GetLastError()); if (type == SOCK_STREAM && listen(s, qlen) == SOCKET_ERROR) errexit("can't listen on %s port: %d\n", service, GetLastError()); return s; *************************************************************** [TIME 伺服器 ]: 用戶端送一個任意資料段給伺服器, 而回應時間 /* UDPtimed.cpp - main */ #include <time.h> 27
28 #include <winsock.h> SOCKET passiveudp(const char *); void errexit(const char *,...); #define WINEPOCH /* Windows epoch, in UCT secs */ #define WSVERS MAKEWORD(2, 0) /* * main - Iterative UDP server for TIME service * */ int main(int argc, char *argv[]) { struct sockaddr_in fsin; /* the from address of a client */ char *service = "time"; /* service name or port number */ char buf[2048]; /* "input" buffer; any size > 1 packet */ SOCKET sock; /* server socket */ time_t now; /* current time */ int alen; /* from-address length */ WSADATA wsadata; switch (argc) { case 1: break; case 2: service = argv[1]; break; default: errexit("usage: UDPtimed [port]\n"); if (WSAStartup(WSVERS, &wsadata)) errexit("wsastartup failed\n"); sock = passiveudp(service); while (1) { 28
29 alen = sizeof(fsin); if (recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&fsin, &alen) == SOCKET_ERROR) errexit("recvfrom: error %d\n", GetLastError()); (void) time(&now); now = htonl((u_long)(now + WINEPOCH)); (void) sendto(sock, (char *)&now, sizeof(now), 0, (struct sockaddr *)&fsin, sizeof(fsin)); return 1; /* not reached */ 3. 同時 非連接伺服器 [ 演算法 ] 主要 1) 建立一個 socket, 將他連結 (bind) 到所用服務的公開位址上 讓 socket 未連接! 主要 2) 反覆呼叫 recvfrom(), 接收從用戶端來的下個需求, 並建立一個新的 從屬線 (slave thread) 來處理這個回應 從屬 1) 在建立時, 收取這個特殊的需求與對 socket 的存取 從屬 2) 根據應用程式, 產生回應, 並使用 sendto() 送回回應 從屬 3) 結束這個從屬線 ( 只處理一個需求 ) 29
30 4. 同時 連接導向伺服器 (TCP) [ 演算法 ] 主要 1) 建立一個 socket, 將他連結 (bind) 到所用服務的公開位址上 讓 socket 未連接! 主要 2) 將 socket 設成 被動 模式, 準備讓伺服器使用 主要 3) 反覆呼叫 accept(), 接收從用戶端來的下個需求, 並建立一個新的 從屬線 (slave thread) 來處理這個回應 從屬 1) 在建立時, 收取這個連線需求 從屬 2) 透過連結, 與用戶端收送需求與回應 從屬 3) 關閉這個連結, 結束這個從屬線 ( 處理完這個用戶端所有的需求 ) 範例 :ECHO 伺服器服務 /* TCPechod.cpp - main, TCPechod */ #include <stdio.h> #include <winsock.h> #include <process.h> #define QLEN 5 /* maximum connection queue length */ 30
31 #define STKSIZE #define BUFSIZE 4096 #define WSVERS MAKEWORD(2, 0) SOCKET msock, ssock; /* master & slave server sockets */ int TCPechod(SOCKET); void errexit(const char *,...); SOCKET passivetcp(const char *, int); /* * main - Concurrent TCP server for ECHO service * */ int main(int argc, char *argv[]) { char *service = "echo";/* service name or port number */ struct sockaddr_in fsin; /* the address of a client */ int alen; /* length of client's address */ WSADATA wsadata; switch (argc) { case 1: break; case 2: service = argv[1]; break; default: errexit("usage: TCPechod [port]\n"); if (WSAStartup(WSVERS, &wsadata)!= 0) errexit("wsastartup failed\n"); msock = passivetcp(service, QLEN); while (1) { alen = sizeof(fsin); 31
32 ssock = accept(msock, (struct sockaddr *)&fsin, &alen); if (ssock == INVALID_SOCKET) errexit("accept: error number\n", GetLastError()); if (_beginthread((void (*)(void *))TCPechod, STKSIZE, (void *)ssock) < 0) { errexit("_beginthread: %s\n", strerror(errno)); return 1; /* not reached */ /* * TCPechod - echo data until end of file * */ int TCPechod(SOCKET fd) { char buf[bufsize]; int cc; cc = recv(fd, buf, sizeof buf, 0); while (cc!= SOCKET_ERROR && cc > 0) { if (send(fd, buf, cc, 0) == SOCKET_ERROR) { fprintf(stderr, "echo send error: %d\n", GetLastError()); break; cc = recv(fd, buf, sizeof buf, 0); if (cc == SOCKET_ERROR) fprintf(stderr, "echo recv error: %d\n", GetLastError()); closesocket(fd); return 0; 32
33 六 參考書目 [1] 林軍鼐, "Winsock API", bbs.ntu.edu.tw 之 Network board [2] D. Comer, D. Stevens, "Internetworking with TCP/IP, Vol. III, Client-Server Programming and Applications: Windows Sockets Version", Prentice Hall, [3] W. Stevens, "Unix Networking Programming-Networking APIs: Sockets and XTI", Vol. 1, the 2 nd ed., Prentice Hall, [4] 李孟書 黃鶴超譯, "Windows Sockets 網路程式設計經典 ", 基峰,
34 一 BSD Socket 程式庫 附錄 --- 函式說明 (1) accept(): 接受某一 Socket 的連接要求, 以完成 Stream Socket 的連接 格式 : SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr, int FAR *addrlen); 參數 : s Socket 的識別碼 addr 存放來連接的彼端的位址 addrlen addr 的長度傳回值 : 成功 - 新的 Socket 識別碼失敗 - INVALID_SOCKET ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : Server 端之應用程式呼叫此一函式來接受 Client 端要求之 Socket 連接動作 ; 如果 Server 端之 Socket 是為 Blocking 模式, 且沒有人要求連接動作, 那麼此一函式會 Block 函式馬上回覆錯誤 accept() 函式的答覆值為一新的 Socket, 此 Socket 不可再用來接受其它的連接要求 ; 但是原先之 Socket 仍可接受其他人的連接要求 (2) bind(): 指定 Socket 的 Local 位址 (Address) 格式 : int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name, int namelen ); 參數 :s Socket 的識別碼 name Socket 的位址值, 其格式為 struct sockaddr { u_short sa_family; char sa_data[14]; ; namelen name 的長度 傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此一函式是指定 Local 位址及 Port 給某一未定名之 Socket 使用者若不在意位址或 Port 的值, 那麼他可以設定位址為 INADDR_ANY, 及 Port 為 0; 那麼 Windows Sockets 會自動將其設定適當之位址及 Port(1024 到
35 之間的值 ), 使用者可以在此 Socket 真正連接完成後, 呼叫 getsockname() 來獲知其被設定的值 (3) closesocket(): 關閉某一 Socket 格式 : int PASCAL FAR closesocket( SOCKET s ); 參數 : s Socket 的識別碼傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此一函式是用來關閉某一 Socket 若是使用者原先對要關閉之 Socket 設定 SO_DONTLINGER, 則在呼叫此一函式後, 會馬上回覆, 但是此一 Sokcet 尚未傳送完畢的資料會繼續送完後才關閉 若是使用者原先設定此 Socket 為 SO_LINGER, 則有兩種情況 : (a) Timeout 設為 0 的話, 此一 Socket 馬上重新設定 (reset), 未傳完或未收到的資料全部遺失 (b) Timeout 不為 0 的話, 則會將資料送完, 或是等到 Timeout 發生後才關閉 (4) connect(): 要求連接某一 Socket 到指定的對方 格式 : int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen ); 參數 :s Socket 的識別碼 name 此 Socket 想要連接的對方位址 namelen name 的長度傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來向對方要求建立連接 若是指定的對方位址為 0 的話, 會傳回錯誤值 當連接建立完成後, 使用者即可利用此一 Socket 來做傳送或接收資料之用了 (5) getpeername(): 獲取已連接成功之 Socket 的對方位址 格式 : int PASCAL FAR getpeername( SOCKET s, struct sockaddr FAR *name, int FAR *namelen); 35
36 參數 :s Socket 的識別碼 name 此 Socket 連接的對方位址 namelen name 的長度傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式可用來取得已連接成功的 Socket 的彼端之位址資料 (6) getsockname(): 獲取 Socket 的 Local 位址資料 格式 : int PASCAL FAR getsockname( SOCKET s, struct sockaddr FAR *name, int FAR *namelen); 參數 :s Socket 的識別碼 name 此 Socket 的 Local 位址 namelen name 的長度傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式是用來取得已設定位址或已連接之 Socket 的本端位址資料 若是此 Socket 被設定為 INADDR_ANY, 則需等真正建立連接成功後才會傳回正確的位址 (7) getsockopt(): 要求某一 Socket 目前狀態設定的資料 格式 : int PASCAL FAR getsockopt( SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen); 參數 :s Socket 的識別碼 level 選項設定的 level optname 選項名稱 optval 選項的設定值 optlen 選項設定值的長度傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來獲取目前 Socket 的某些狀態設定值 WINSOCK 提供之 level 只有 SOL_SOCKET 及 IPPROTO_TCP optname 則有以下之選擇 : 36
37 Value Type (* 表暫不提供此功能選項 ) SO_ACCEPTCONN BOOL SO_BROADCAST BOOL *SO_DEBUG BOOL SO_DONTLINGER BOOL *SO_DONTROUTE BOOL *SO_ERROR int *SO_KEEPALIVE BOOL SO_LINGER struct linger FAR* SO_OOBINLINE BOOL *SO_RCVBUF int SO_REUSEADDR BOOL *SO_SNDBUF int SO_TYPE int TCP_NODELAY BOOL (8) htonl() : 將一 32 位元 u_long 的值由 host 的排列方式轉換成 network 的排列方式 格式 : u_long PASCAL FAR htonl( u_long hostlong ); 參數 : hostlong 一個 32 位元 host 排列方式的數目傳回值 : 一個 32 位元 network 排列方式的數目說明 : 因為 network 的排列方式與 host 的排列方式可能不同, 所以我們需要此一函式來做轉換 (9) htons() : 將一 16 位元 u_short 的值由 host 的排列方式轉換成 network 的排列方式 格式 : u_short PASCAL FAR htons( u_short hostshort ); 參數 : hostshort 一個 16 位元 host 排列方式的數目傳回值 : 一個 16 位元 network 排列方式的數目說明 : 因為 network 的排列方式與 host 的排列方式可能不同, 所以我們需要此一函式來做轉換 (10) inet_addr(): 將字串格式的位址轉換成 32 位元 unsigned long 的格式 格式 : unsigned long PASCAL FAR inet_addr( const char FAR *cp ); 37
38 參數 : cp 一個代表位址的 點格式 (dotted) 字串傳回值 : 成功 - 一個代表 Internet 位址的 unsigned long 失敗 - INADDR_NONE 說明 : 此函式將一 點格式 的位址字串轉換成適用之 Intenet 位址 點格式 字串可為以下四種方式之任一 : (i) a.b.c.d (ii) a.b.c (iii) a.b (iv) a (11) inet_ntoa(): 將一網路位址轉換成 點格式 字串 格式 : char FAR * PASCAL FAR inet_ntoa( struct in_addr in ); 參數 : in 一個代表 Internet 位址的結構傳回值 : 成功 - 一個代表位址的 點格式 (dotted) 字串失敗 - NULL 說明 : 此函式將一 Internet 位址轉換成 a.b.c.d 字串格式 (12) ioctlsocket(): 控制 Socket 的模式 格式 : int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR *argp ); 參數 :s Socket 的識別碼 cmd 指令名稱 argp 指向 cmd 參數的指標傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來獲取或設定 Socket 的運作參數 其所提供的指令有 : FIONBIO 開關 non-blocking 模式 FIONREAD 自 Socket 一次可讀取的資料量 SIOCATMARK OOB 資料是否已被讀取完 (* 暫不提供此功能 ) (13) listen(): 設定 Socket 為監聽狀態, 準備被連接 格式 : int PASCAL FAR listen( SOCKET s, int backlog ); 參數 :s Socket 的識別碼 backlog 未真正完成連接前 ( 尚未呼叫 accept() 前 ) 彼端的連接要求的最大個數傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 38
39 說明 : 使用者可利用此函式來設定 Socket 進入監聽狀態, 並設定最多可有多少個在未真正完成連接前的彼端的連接要求 ( 目前最大值限制為 5, 最小值為 1) (14) ntohl() : 將一 32 位元 u_long 的值由 network 排列方式轉換成 host 排列方式 格式 : u_long PASCAL FAR ntohl( u_long netlong ); 參數 : netlong 一個 32 位元 network 排列方式的數目傳回值 : 一個 32 位元 host 排列方式的數目說明 : 因為 network 的排列方式與 host 的排列方式可能不同, 所以我們需要此一函式來做轉換 (15) ntohs() : 將一 16 位元 u_short 的值由 network 排列方式轉換成 host 排列方式 格式 : u_short PASCAL FAR ntohs( u_short netshort ); 參數 : netshort 一個 16 位元 network 排列方式的數目傳回值 : 一個 16 位元 host 排列方式的數目說明 : 因為 network 的排列方式與 host 的排列方式可能不同, 所以我們需要此一函式來做轉換 (16) recv(): 自 Socket 接收資料 格式 : int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags ); 參數 :s Socket 的識別碼 buf 存放接收到的資料的暫存區 len buf 的長度 flags 此函式被呼叫的方式傳回值 : 成功 - 接收到的資料長度 ( 若對方 Socket 已關閉, 則為 0) 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來自連接式的 Datagram Socket 或 Stream Socket 接收資料 對 Stream Socket 言, 我們可以接收到目前有效的 (available) 資料, 但其數量不超過 len 的大小 若是此 Socket 設定 SO_OOBINLINE, 且有 out-of-band 的資料未被讀取, 那麼只有 out-of-band 的資料被取出 對 Datagram Socket 39
40 言, 只取出第一個 datagram; 若是該 datagram 大於使用者提供的儲存空間, 那麼只有該空間大小的資料被取出, 多餘的資料將遺失, 且回覆錯誤的訊息 flags 的值可為 MSG_PEEK MSG_OOB(* 暫不提供此功能 ) 的組合 (17) recvfrom(): 讀取一個 Datagram, 並儲存資料來源的位址 格式 : int PASCAL FAR recvfrom(socket s, char FAR *buf, int len, int flags, struct socketaddr FAR *from, int FAR *fromlen ); 參數 :s Socket 的識別碼 buf 存放接收到的資料的暫存區 len buf 的長度 flags 此函式被呼叫的方式 from 資料來源的位址 fromlen from 的大小傳回值 : 成功 - 接收到的資料長度 ( 若對方 Socket 已關閉, 則為 0) 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來讀取資料並記錄資料來源的位址 對 Stream Socket 言, 其作用與 recv() 相同, 參數 from 及 fromlen 將不被用到 (18) select(): 檢查一或多個 Sockets 是否處於可讀 可寫或錯誤的狀態 格式 : int PASCAL FAR select( int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout ); 參數 :nfds 此參數在此並無作用 readfds 要被檢查是否可讀的 Sockets writefds 要被檢查是否可寫的 Sockets exceptfds 要被檢查是否有錯誤的 Sockets (* 暫無作用 ) timeout 此函式該等待的時間 若為 NULL 時, 表示 blocking, 此函式會等到有事件發生 傳回值 : 成功 - 符合條件的 Sockets 總數 ( 若 Timeout 發生, 則為 0) 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 40
41 說明 : 使用者可利用此函式來檢查 Sockets 是否有資料可被讀取, 或是有空間可以寫入, 或是有錯誤發生 (19) send(): 使用連接式的 Socket 傳送資料 格式 : int PASCAL FAR send(socket s, const char FAR *buf, int len, int flags ); 參數 :s Socket 的識別碼 buf 存放要傳送的資料的暫存區 len buf 的長度 flags 此函式被呼叫的方式傳回值 : 成功 - 送出的資料長度失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式適用於連接式的 Datagram 或 Stream Socket 來傳送資料 對 Datagram Socket 言, 若是 datagram 的大小超過限制, 則將不會送出任何資料, 並會傳回錯誤值 若是傳送 (transport) 系統內之儲存空間不夠存放這些要傳送的資料,send() 將會被 block 住, 除非該 Socket 被設定為 non-blocking 模式 使用者亦須注意 send() 函式執行完成, 並不表示資料已經成功地送抵對方了 flags 的值可設為 MSG_DONTROUTE(* 暫不提供此功能 ) 及 MSG_OOB 的組合 (20) sendto(): 將資料送到指定的目的地 格式 : int PASCAL FAR sendto( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen ); 參數 :s Socket 的識別碼 buf 存放要傳送的資料的暫存區 len buf 的長度 flags 此函式被呼叫的方式 to 資料要送達的位址 tolen to 的大小傳回值 : 成功 - 送出的資料長度失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 41
42 說明 : 此函式適用於 Datagram 或 Stream Socket 來傳送資料到指定的位址 對 Datagram Socket 言, 若是 datagram 的大小超過限制, 則將不會送出任何資料, 並會傳回錯誤值 對 Stream Socket 言, 其作用與 send() 相同 ; 參數 to 及 tolen 在此並無作用 若是傳送 (transport) 系統內之儲存空間不夠存放這些要傳送的資料,sendto() 將會被 block 住, 除非該 Socket 被設定為 non-blocking 模式 使用者亦須注意 sendto() 函式執行完成, 並不表示資料已經成功地送抵對方了 flags 的值可設為 MSG_DONTROUTE(* 暫不提供此功能 ) 及 MSG_OOB 的組合 (21) setsockopt(): 設定 Socket 的狀態 格式 : int PASCAL FAR setsockopt( SOCKET s, int level, int optname, const char FAR *optval, int optlen ); 參數 :s Socket 的識別碼 level 選項設定的 level optname 選項名稱 optval 選項的設定值 optlen 選項設定值的長度 傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來設定 Socket 的一些選項, 藉以更改其動作 可更改的 選項有 : Value Type (* 表暫不提供此功能選項 ) SO_BROADCAST BOOL *SO_DEBUG BOOL SO_DONTLINGER BOOL *SO_DONTROUTE BOOL *SO_KEEPALIVE BOOL SO_LINGER struct linger FAR* SO_OOBINLINE BOOL *SO_RCVBUF int SO_REUSEADDR BOOL *SO_SNDBUF int TCP_NODELAY BOOL 42
43 (22) shutdown(): 停止 Socket 接收 / 傳送的功能 格式 : int PASCAL FAR shutdown( SOCKET s, int how ); 參數 :s Socket 的識別碼 how 代表該停止那些動作的標幟傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來停止 Socket 的後續接收或傳送的功能 若 how 的值為 0, 則不再接收資料 若 how 的值為 1, 則不再允許傳送資料 若 how 的值為 2, 則不再接收且不再傳送資料 shutdown() 函式並沒有將 Socket 關閉, 所以該 Socket 所佔用之資源必須在呼叫 closesocket() 之後才會釋放 (23) socket(): 建立 Socket 格式 : SOCKET PASCAL FAR socket( int af, int type, int protocol ); 參數 :af 目前只提供 PF_INET(AF_INET) type Socket 的型態 (SOCK_STREAM SOCK_DGRAM) protocol 通訊協定 ( 如果使用者不指定則設為 0) 傳回值 : 成功 - Socket 的識別碼失敗 - INVALID_SOCKET( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來建立一 Socket, 並為此 Socket 建立其所使用的資源 Socket 的型態可為 Stream Socket 或 Datagram Socket (24) gethostbyaddr(): 利用某一 host 的位址來獲取該 host 的資料 格式 :struct hostent FAR * PASCAL FAR gethostbyaddr( const char FAR *addr, int len, int type ); 參數 :addr network 排列方式的位址 len addr 的長度 type PF_INET(AF_INET) 傳回值 : 成功 - 指向 struct hostent 的指標 struct hostent { char FAR * h_name; char FAR * FAR * h_aliases; short h_addrtype; 43
44 short h_length; char FAR * FAR * h_addr_list; 失敗 - NULL ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式是利用位址來獲取 host 的其他資料, 如 host 的名稱 別名, 位址的型態 長度等 (25) gethostbyname(): 利用某一 host 的名稱來獲取該 host 的資料 格式 : struct hostent FAR * PASCAL FAR gethostbyname( const char FAR *name ); 參數 : name host 的名稱 傳回值 : 成功 - 指向 struct hostent 的指標 struct hostent { char FAR * h_name; char FAR * FAR * h_aliases; short h_addrtype; short h_length; char FAR * FAR * h_addr_list; 失敗 - NULL ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式是利用 host 名稱來獲取其他的資料, 如 host 的位址 別名, 位址的型態 長度等 (26) gethostname(): 獲取目前使用者使用的 host 的名稱 格式 : int PASCAL FAR gethostname( char FAR *name, int namelen ); 參數 :name 用來存放 host 名稱的暫存區 namelen name 的大小傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 此函式用來獲取 host 的名稱 (27) getprotobyname(): 依照通訊協定 (protocol) 的名稱來獲取該通訊協定的其他資料 格式 : struct protoent FAR * PASCAL FAR getprotobyname( const char FAR *name ); 44
45 參數 : name 通訊協定名稱 傳回值 : 成功 - 一指向 struct protoent 的指標 struct protoent { char FAR * p_name; char FAR * FAR * p_aliases; short p_proto; 失敗 - NULL ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 利用通訊協定的名稱來得知該通訊協定的別名 編號等資料 (28) getprotobynumber(): 依照通訊協定的編號來獲取該通訊協定的其他資料 格式 : struct protoent FAR * PASCAL FAR getprotobynumber( int number ); 參數 : number 以 host 排列方式的通訊協定編號 傳回值 : 成功 - 一指向 struct protoent 的指標 struct protoent { char FAR * p_name; char FAR * FAR * p_aliases; short p_proto; 失敗 - NULL ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 利用通訊協定的編號來得知該通訊協定的名稱 別名等資料 (29) getservbyname(): 依照服務 (service) 名稱及通訊協定來獲取該服務的其他資料 格式 : struct servent * PASCAL FAR getservbyname( const char FAR *name, const char FAR *proto ); 參數 :name 服務名稱 proto 通訊協定名稱 傳回值 : 成功 - 一指向 struct servent 的指標 struct servent { char FAR * s_name; char FAR * FAR * s_aliases; short s_port; char FAR * s_proto; 45
46 失敗 - NULL ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 利用服務名稱及通訊協定來獲得該服務的別名 使用的 port 編號等 (30) getservbyport(): 依照服務 (service) 的 port 編號及通訊協定來獲取該服務的其他資料 格式 : struct servent * PASCAL FAR getservbyport( int port, const char FAR *proto ); 參數 :port 服務的 port 編號 proto 通訊協定名稱 傳回值 : 成功 - 一指向 struct servent 的指標 struct servent { char FAR * s_name; char FAR * FAR * s_aliases; short s_port; char FAR * s_proto; 失敗 - NULL ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 利用 port 編號及通訊協定來獲得該服務的名稱 別名等 二 Microsoft Windows-specific Extensions (1) WSACleanup(): 結束 Windows Sockets DLL 的使用 格式 : int PASCAL FAR WSACleanup( void ); 參數 : 無傳回值 : 成功 - 0 失敗 - SOCKET_ERROR ( 呼叫 WSAGetLastError() 可得知原因 ) 說明 : 應用程式在使用 Windows Sockets DLL 時必須先呼叫 WSAStartup() 來向 Windows Sockets DLL 註冊 ; 當應用程式不再需要使用 Windows SocketsDLL 時, 須呼叫此一函式來註銷使用, 以便釋放其占用的資源 (2) WSAGetLastError(): 獲取最後一次錯誤發生時的訊息 格式 : int PASCAL FAR WSAGetLastError( void ); 參數 : 無 46
47 傳回值 : Windows Sockets API 最後發生的錯誤碼 說明 : 此函式用來獲取最後一次網路錯誤發生時的訊息 (3) WSAStartup(): 連結應用程式與 Windows Sockets DLL 的第一個函式 格式 : int PASCAL FAR WSAStartup(WORD wversionrequested, LPWSADATA lpwsadata ); 參數 :wversionrequested 可使用的 Windows Sockets API 最高版本 lpwsadata 指向 WSADATA 資料的指標 系統傳回真正使用 WinSock 版本的資訊 struct WSAData { WORD wversion; WORD whighversion; char szdescription[wsadescription_len+1]; char szsystemstatus[wsasysstatus_len+1]; unsigned short imaxsockets; unsigned short imaxudpdg; char FAR * lpvendorinfo; ; 傳回值 : 成功 0 失敗 WSASYSNOTREADY / WSAVERNOTSUPPORTED / WSAEINVAL 說明 : 此函式 必須 是應用程式呼叫到 Windows Sockets DLL 函式中 的第一個, 也唯有此函式呼叫成功後, 才可以再呼叫其他 Windows SocketsDLL 的函式 此函式亦讓使用者可以指定要使用的 Windows SocketsAPI 版本, 及獲 取設計者的一些資訊 47
ebook35-21
21 Linux L i n u x 211 U N I X U N I X I / O F I F O U N I X I n t e r n e t s o c k e t () s o c k e t () send() r e c v ( read() w r i t e () send() r e c v () I n t e r n e t 212 Internet Internet S
More information《 计 算 机 网 络 》
1 ... 5 1.1... 5 1.2... 5 1.3... 5 1.4... 6 BOSON NETSIM...11 2.1... 11 2.2... 11 2.3 BOSON NETSIM... 27 CISCO... 31 3.1... 31 3.2 IP... 33 3.3... 34... 36 4.1... 36 4.2... 41 4.3... 47 Socket 2 ... 50
More informationebook12-1
API N e t B I O S Wi n s o c k A P I Wi n s o c k 1 N e t B I O S Wi n s o c k A P I N e t B I O S O S / 2 D O S 2 3 4 Wi n d o w s Wi n d o w s 1 NetBIOS Network Basic Input/Output System, NetBIOS A P
More informationVoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub
VoIP... 2... 2 Abstract... 2... 3... 3 RTP...3 Socket...4...6...7 IP...9 Config Two Voice-hub... 10 1 12 VoIP VoIP voice-hub voice-hub Abstract At the beginning of this paper, we introducted the essential
More informationChapter 5- 运输层 (5)-2017
计算机网络 运输层编程 (5) 陈旺虎 chenwh@nwnu.edu.cn Review TCP 协议格式 TCP 可靠传输 为什么需要三次握手? A 发送一次确认的原因 应对出现 已失效的连接请求报文段 的情况, 即防止已失效的连接请求报文段突然又传到了 B 例 1:A 发出连接请求, 但该请求丢失,A 重传连接请求, 到达 B, 则正常 ; 一. 认识 Socket 应用层程序 流套接字接口
More informationBasics of Socket Programming Please check the referenced links for the further description and examples. 1 Procedures for Socket Implementation 1. Create the server application (e.g. a simple shellscript)
More informationChap04
Socket 编程介绍 Socket Socket 网络编程 按照操作系统 Windows 的 socket 编程 *nix 的 socket 编程 按照编程语 言 使 用C++ Java 的 socket 编程 使 用脚本语 言的 socket 编程 Socket 的 一些历史 Sockets 本来是 UNIX 操作系统下流 行行的 一种 网络编程接 口 (API), 在 4.2 BSD 中被 首先引
More informationuntitled
Lwip Swedish Institute of Computer Science February 20, 2001 Adam Dunkels adam@sics.se (QQ: 10205001) (QQ: 329147) (QQ:3232253) (QQ:3232253) QQ ARM TCPIP LCD10988210 LWIP TCP/IP LWIP LWIP lwip API lwip
More informationCC213
: (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,
More informationMicrosoft PowerPoint - Socket programming.ppt [相容模式]
Basic Concept of Socket Socket programming 位於傳輸層和應用層之間 socket 是一種可做雙向資料傳輸的通道 讓應用層可以傳送資料給 socket, 或是從 socket 接收資料 Jimmy 2011/3/29 Concept of Socket Relation between Socket and Application Socket 的概念和檔案代碼觀念相似,
More informationChap6.ppt
Computer Networks v4 cs.sjtu 12/21/12 6 Internet ftp://ftp.cs.sjtu.edu.cn/ybzhang 61 / 110 Computer Networks v4 cs.sjtu 12/21/12 ftp://ftp.cs.sjtu.edu.cn/ybzhang 62 / 110 Computer Networks v4 cs.sjtu 12/21/12
More informationC6_ppt.PDF
C01-202 1 2 - (Masquerade) (Replay) (Message Modification) (Denial of Service) - ( ) (Eavesdropping) (Traffic Analysis) 8 1 2 7 3 6 5 4 3 - TCP SYN (SYN flood) Smurf Ping of Death LAND Attack Teardrop
More informationebook67-1
1 1.1 T C P / I P T C P / I P 60 9 ( I n t e r n e t ) WA N 100 T C P / I P T C P / I P [ Lynch 1993] 1.2 Telnet FTP e-mail T C P / I P TCP UDP T C P / I P 1-1 1) 1-1 TCP/IP 2) T C P / I P I I C M P I
More information新・明解C言語入門編『索引』
!... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177
More informationSimulator By SunLingxi 2003
Simulator By SunLingxi sunlingxi@sina.com 2003 windows 2000 Tornado ping ping 1. Tornado Full Simulator...3 2....3 3. ping...6 4. Tornado Simulator BSP...6 5. VxWorks simpc...7 6. simulator...7 7. simulator
More information/ / (FC 3)...
Modbus/TCP 1.0 1999 3 29 Andy Swales Schneider aswales@modicon.com ... 2 1.... 3 2.... 3 2.1.. 3 2.2..4 2.3..4 2.4... 5 3.... 5 3.1 0... 5 3.2 1... 5 3.3 2... 6 3.4 / /... 7 4.... 7 5.... 8 5.1 0... 9
More informationIP505SM_manual_cn.doc
IP505SM 1 Introduction 1...4...4...4...5 LAN...5...5...6...6...7 LED...7...7 2...9...9...9 3...11...11...12...12...12...14...18 LAN...19 DHCP...20...21 4 PC...22...22 Windows...22 TCP/IP -...22 TCP/IP
More informationFY.DOC
高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主
More information(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2
(2005-01-26) (2005-01-26) (2005-02-27) PIC_SERVER (9) VB TCP/UDP Visual Basic Microsoft Winsock Control (MSWINSCK.OCX) UDP TCP Client Server Visual Basic UDP/TCP PIC_SERVER UDP/TCP 1. Microsoft Winsock
More information<4D6963726F736F667420576F7264202D20BCC6CBE3BBFACDF8C2E7CAB5D1E9D6B8B5BCCAD6B2E12E646F63>
计 算 机 网 络 实 验 指 导 手 册 华 中 科 技 大 学 计 算 机 学 院 二 零 零 九 年 三 月 I 目 录 实 验 一 网 络 组 建 与 实 施 第 一 章 实 验 目 标 和 内 容... 1 1.1 实 验 目 的... 1 1.2 实 验 环 境... 1 1.3 实 验 要 求... 1 1.4 实 验 内 容... 2 第 二 章 BOSON NETSIM 软 件 包
More informationPowerPoint Presentation
网络编程简介 授课老师 : 赵增华助教 : 杨金峰邮件 : myjfm@163.com 两台计算机通过网络进行通信 端口 端口 A 协议 网络 协议 B 192.168.0.118 192.168.0.10 IP 地址 IP 网络中每台主机都必须有一个惟一的 IP 地址 ; IP 地址是一个逻辑地址 ; 因特网上的 IP 地址具有全球唯一性 ; 32 位, 4 个字节, 常用点分十进制的格式表示,
More informationLinux網路傳輸設定
Linux 網路傳輸設定 南台科技大學電子系 指導老師 : 侯安桑 班級 : 電子碩研一甲 學號 :M9830205 姓名 : 張嘉巖 Android 網路傳輸設定已經完成後, 接下來要開始設定 linux 網路傳輸, 目標是要將 linux 當作 server 端來設計, 使用的程式語言為 C 語言, 此作法會比 android 來的簡單許多, 只要顧慮程式流程和邏輯觀念是否正確即可, 下面會介紹
More informationMicrosoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc
2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.
More informationTitle Unassigned.
基本操作流程 用 usock 函数编写 TCP 客户端程序 usock_open 用 usock_open 获取一个 usock 描述符 usock_connect 用刚才返回的描述符进行 connect 操作 connect 时指定的对方地址用 usockaddr_in 结构体描述 usock_write 用 usock_write 写数据给对方, 用 usock_read 读取对方发来的数据 usock_read
More information9 Internet 10 Internet
1 2 3 4 5 6 Internet 7 8 9 Internet 10 Internet 11 12 1 1.1 1.2 1.3 1.4 1.5 1.6 1.1 1.1.1 20 50 20 60 ARPANET ARPANET Internet 20 70 ISO International Organization for Standardization TCP/IP 20 90 Internet
More information工程硕士信息通信网实验讲义.doc
1 Linux 1.1 Linux 1.1.1 Linux 1.1.2 Linux Linux --help arp help manual manual TCP/IP ARPIP RFC1812 2.2.3 IPV4 IPv6 RFC ftp 1.1.3 1 ARP ip addr show up eth0 IP ip neigh show ARP VLAN VLAN IP Ping ICMP echo
More informationC/C++语言 - C/C++数据
C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;
More information图 4.2 udpclient 项目解决方案 3. 客户机程序编码如下 : 程序 : udp 客户机程序 udpclient.cpp
实验四 UDP 客户机和服务器设计 一 实验目的 1. 学习和理解 UDP 协议 ( 对照 TCP 协议 ) 2. 掌握 UDP 客户机与服务器程序的设计方法 3. 掌握 UDP 套接字创建方法, 掌握 sendto recvfrom 等函数用法 注意与 send recv 函数做对比性学习 二 实验内容 1. 完成发送和接收数据报的客户机设计 2. 完成接收和回送数据报的服务器设计 3.( 选做
More informationuntitled
1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override
More informationW. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO
Linux muduo C++ (giantchen@gmail.com) 2012-09-30 C++ TCP C++ x86-64 Linux TCP one loop per thread Linux native muduo C++ IT 5 C++ muduo 2 C++ C++ Primer 4 W. Richard Stevens UNIX Sockets API echo Sockets
More information下表所示, 此时 protocol 参数可使用缺省值 0 ; 但如果还有多个协议供选择, 则必须使用 protocol 参数来标识 协议族 ( 仅考虑 IP 协议 传送类型 protocol 参数常量 协议类型 族 ) (/usr/include/linux/in.h) SOCK_STREAM IP
实验 2 参考资料 Linux/Unix:Socket 函数库 Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的 BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Linux 下的 Socket 程序设计, 除了微小的差别之外, 也适用于大多数其它 Unix 系统 Socket 的使用和文件操作比较类似 如同文件的读
More information工程师培训
.1 TCP/IP TCP/IP 1 .2.2.1 Host 1960 S 1970 S Host Low Speed Lines 1970 S 1980 S pc Server Local Interneting 1980 S 1990 S Branch. pc Branch. WAN Branch. pc pc IBM SNA IBM X.25 2 .2.2 OSI OSI Application
More informationebook140-8
8 Microsoft VPN Windows NT 4 V P N Windows 98 Client 7 Vintage Air V P N 7 Wi n d o w s NT V P N 7 VPN ( ) 7 Novell NetWare VPN 8.1 PPTP NT4 VPN Q 154091 M i c r o s o f t Windows NT RAS [ ] Windows NT4
More informationUDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC
8 TCP/IP TCP/IP TCP OSI 8.1 OSI 4 end to end A B FTP OSI Connection Management handshake Flow Control Error Detection IP Response to User s Request TCP/IP TCP 181 UDP 8.2 TCP/IP OSI OSI 3 OSI 3 8.1 TCP/IP
More informationChapter #
第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层
More informationC 1
C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=
More information第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特 网 的 标 准 化 工 作 1.2.4 计 算 机 网 络 在
计 算 机 网 络 ( 第 4 版 ) 课 件 第 1 章 计 算 机 网 络 概 述 郭 庆 北 Ise_guoqb@ujn.edu.cn 2009-02-25 第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特
More informationC++ 程式設計
C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004
More information<4D F736F F D20BAF4BADEA457BDD2B1D0A7F7ADECA96CC0C95F424342B57BA6A1B2D52E646F63>
電腦網路與程式課程 BC++Builder 程式設計 BCB 程式組教材 授課人員 : 葉書詠 目錄 第一章 -C++ Builder 程式教學 第二章 -VCL 元件介紹 第三章 - 使用 socket 撰寫 BCB 網路程式 第四章 - 程式流程設定範例 第一章 - C++ Builder 程式教學 1.C 語言複習 while while( 條件式 ) { 動作 ----------- do
More information, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1
21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414
More informationThe golden pins of the PCI card can be oxidized after months or years
Q. 如何在 LabWindows/CVI 編譯 DAQ Card 程式? A: 請參考至下列步驟 : 步驟 1: 安裝驅動程式 1. 安裝 UniDAQ 驅動程式 UniDAQ 驅動程式下載位置 : CD:\NAPDOS\PCI\UniDAQ\DLL\Driver\ ftp://ftp.icpdas.com/pub/cd/iocard/pci/napdos/pci/unidaq/dll/driver/
More informationTCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP
TCP/IP : TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP 1. ASCII EBCDIC Extended Binary-Coded Decimal Interchange Code 2. / (1) (2) Single System Image SSI) (3) I/O (4) 3.OSI OSI Open System Interconnection
More informationebook67-9
9 IP 9.1 I P 9-1 I P 9-1 d a e m o n U n i x d a e m o n d a e m o n [Perlman 1992] 10 R I P Routing Information Protocol I P 9-1 I P 30 I C M P 9. 5 r o u t e n e t s t a t route netstat UDP TCP ICMP
More informationSlide 1
网络编程入门篇 Select: 非阻塞 Socket 编程 目录 基础知识 具体示例 注意事项 示例代码讲解 基础知识 基础知识 在 RT-Thread 使用 socket 网络编程时, 由于 socket 的 recv 和 send 的实现是阻塞式的, 因此当一个任务调用 recv() 函数接收数据时, 如果 socket 上并没有接收到数据, 这个任务将阻塞在 recv() 函数里 这个时候,
More informationuntitled
MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12
More informationMicrosoft PowerPoint - 数据通信-ch1.ppt
主 要 内 容 与 基 本 要 求 主 要 内 容 数 据 通 信 与 计 算 机 网 络 计 算 机 网 络 的 发 展 过 程 分 类 以 及 主 要 性 能 指 标 ; 分 组 交 换 的 基 本 原 理 及 其 与 电 路 交 换 报 文 交 换 的 联 系 与 区 别 ; 计 算 机 网 络 的 协 议 与 体 系 结 构 第 1 章 概 述 基 本 要 求 掌 握 分 组 交 换 电 路
More information新版 明解C++入門編
511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,
More information经华名家讲堂
5.1 5.1.1 5.1.2 5.2 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.3 5.3.1 5.3.2 5.3.3 / 5.3.4 / 5.3.5 / 5.4 Internet 5.4.1 Internet 5.4.2 Intranet 1. 2. 1 31 5 5.1 5.1.1 Internet 1 Host 20 60 IBM 2000 2 20 60 20 60
More informationPowerPoint Presentation
立 97 年度 SNMG 練 DNS & BIND enc1215@gmail.com DNS BIND Resolver Named 理 Named 更 DNS DNS Reference 2 DNS DNS 料 domain ip DNS server DNS server 理 DNS server DNS DNS 狀. root name server 理 3 DNS 狀 DNS (2). com
More informationWinSockÍøÂç±à³Ì
WinSock 网络编程 1. 概述 80's 初,ARPA( 美国国防部高级研究计划局 ) fi 加利福尼亚大学 Berkeley 分校提供资金,fi 开发在 UNIX 下实现 TCP/IP 协议 fi 为 TCP/IP 开发了一个 API Socket 接口 ( 套接口 ) 俗称 Bekeley 套接口模型 90's 初,Microsoft 等公司 fi 基于 Bekeley 套接口模型 fi
More informationebook140-9
9 VPN VPN Novell BorderManager Windows NT PPTP V P N L A V P N V N P I n t e r n e t V P N 9.1 V P N Windows 98 Windows PPTP VPN Novell BorderManager T M I P s e c Wi n d o w s I n t e r n e t I S P I
More information概述
OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3
More informationuntitled
A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (
More informationData Server_new_.doc
0i B/C Data Server Windows 2000 Window XP Windows XP FTP FANUC Data Server FTP liwei@beijing-fanuc 1 06-10-8 Content 1. /...3 1.1...3 1.2...3 1.3 CNC...3 2....5 2.1 STORAGE...5 2.2 FTP...6 2.3 BUFFER...7
More informationCC213
: (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++
More informationBOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2
PowerBuilder 9 PowerBuilder Native Interface(PBNI) PowerBuilder 9 PowerBuilder C++ Java PowerBuilder 9 PBNI PowerBuilder Java C++ PowerBuilder NVO / PowerBuilder C/C++ PowerBuilder 9.0 PowerBuilder Native
More informationepub 61-2
2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +
More informationuntitled
不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int
More information提纲 1 2 OS Examples for 3
第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may
More information提问袁小兵:
C++ 面 试 试 题 汇 总 柯 贤 富 管 理 软 件 需 求 分 析 篇 1. STL 类 模 板 标 准 库 中 容 器 和 算 法 这 部 分 一 般 称 为 标 准 模 板 库 2. 为 什 么 定 义 虚 的 析 构 函 数? 避 免 内 存 问 题, 当 你 可 能 通 过 基 类 指 针 删 除 派 生 类 对 象 时 必 须 保 证 基 类 析 构 函 数 为 虚 函 数 3.
More informationepub 33-8
8 1) 2) 3) A S C I I 4 C I / O I / 8.1 8.1.1 1. ANSI C F I L E s t d i o. h typedef struct i n t _ f d ; i n t _ c l e f t ; i n t _ m o d e ; c h a r *_ n e x t ; char *_buff; /* /* /* /* /* 1 5 4 C FILE
More informationBus Hound 5
Bus Hound 5.0 ( 1.0) 21IC 2007 7 BusHound perisoft PC hound Bus Hound 6.0 5.0 5.0 Bus Hound, IDE SCSI USB 1394 DVD Windows9X,WindowsMe,NT4.0,2000,2003,XP XP IRP Html ZIP SCSI sense USB Bus Hound 1 Bus
More informationHow to Debug Tuxedo Server printf( Input data is: %s, inputstr); fprintf(stdout, Input data is %s, inputstr); fprintf(stderr, Input data is %s, inputstr); printf( Return data is: %s, outputstr); tpreturn(tpsuccess,
More informationint *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;
Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,
More information嵌入式Linux块设备驱动开发解析
The success's road 嵌 入 式 LINUX 网 络 驱 动 开 发 Copyright 2007-2008 Farsight. All rights reserved. 要 点 Linux 网 络 设 备 驱 动 程 序 概 述 计 算 机 网 络 概 述 skbuf 数 据 结 构 介 绍 Linux 网 络 设 备 驱 动 程 序 API 介 绍 Linux 网 络 设 备 驱
More informationSymantec™ Sygate Enterprise Protection 防护代理安装使用指南
Symantec Sygate Enterprise Protection 防 护 代 理 安 装 使 用 指 南 5.1 版 版 权 信 息 Copyright 2005 Symantec Corporation. 2005 年 Symantec Corporation 版 权 所 有 All rights reserved. 保 留 所 有 权 利 Symantec Symantec 徽 标 Sygate
More information穨IC-1000
IC-1000 LEDOMARS Information Coporation :(02)27913828 :(02)27945895 (04)2610628 (04)2650852 (07)3897016 (07)3897165 http://www.ledomars.com.tw 1 1. IC-1000 2. IC-1000 LED : ERROR LNK/ACT PWR TEST PWR(Power)
More information科学计算的语言-FORTRAN95
科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造
More information第3章 计算机网络体系结构
第 3 章 计 算 机 网 络 体 系 结 构 本 章 内 容 计 算 机 的 网 络 体 系 结 构 网 络 参 考 模 型 五 层 网 络 参 考 模 型 1 3.1 计 算 机 网 络 体 系 结 构 发 展 历 程 分 层 原 理 基 本 概 念 2 发 展 历 程 网 络 体 系 结 构 提 出 的 背 景 计 算 机 网 络 的 复 杂 性 异 质 性 不 同 的 通 信 介 质 有 线
More informationebook140-11
11 VPN Windows NT4 B o r d e r M a n a g e r VPN VPN V P N V P N V P V P N V P N TCP/IP 11.1 V P N V P N / ( ) 11.1.1 11 V P N 285 2 3 1. L A N LAN V P N 10MB 100MB L A N VPN V P N V P N Microsoft PPTP
More information2 本文尚未完成, 僅供中央機械網管使用!! 要公開也等我寫完吧 G Exploring Socket Programming Prefect 聽說, 鳥人超強. Who Should Read This Book? 本書適合想要實作 Winsock 程式的 Programmer 閱讀 這本書的原則
2 本文尚未完成, 僅供中央機械網管使用!! 要公開也等我寫完吧 G Prefect 聽說, 鳥人超強. Who Should Read This Book? 本書適合想要實作 Winsock 程式的 Programmer 閱讀 這本書的原則是 : 1. 以實作為主, 廢話哈啦很少 2. 章節內容以講解每章主題範例程式為主, 因此 Code 會佔很重份量 3. 討論實際設計 Winsock 程式容易遇到的問題
More information財金資訊-80期.indd
IPv6 / LINE YouTube TCP/IP TCP (Transmission Control Protocol) IP (Internet Protocol) (node) (address) IPv4 168.95.1.1 IPv4 1981 RFC 791 --IP IPv4 32 2 32 42 IP (Internet Service Provider ISP) IP IP IPv4
More information网络程序设计(socketAPI)
前言通信模型重要函数 网络程序设计 (socketapi) 孙永科 西南林业大学 2010 年 9 月 6 日 1 / 40 上节回顾 前言通信模型重要函数上节回顾本章重点 阻塞和非阻塞 socket 通信模型大字节顺序小字节顺序网络字节顺序 2 / 40 本章重点 前言通信模型重要函数上节回顾本章重点 1 通信模型基本概念 Socket 通信 Socket 地址 Socket 函数 2 重要函数获取主机信息
More informationChat Room (Client and Server Model)
Chat Room (Client and Server Model) Homework 2 Outline Related knowledge Required Function Function and input/output Demo References Related knowledge client-server model Detail: Server Algorithms Concurrent
More informationMicrosoft Word - DIR-615_B2_Manual_1.00_T_.doc
D-Link DIR-615 Wireless N Broadband Router DIR-615...4 DIR-615...6...7 DIR-615...10 IP...10 DIR-615...15 DIR-615...24 DIR-615...29 D-Link DWA-645 DIR-615...30 Windows XP SP2...32 Windows Vista...35 (1)
More information2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d
2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,
More information前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56
前言 UDP 基础通信实例广播和多播思考练习.... 网络程序设计 (UDP).. 孙永科 西南林业大学 2010 年 8 月 21 日 1 / 56 前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56 前言 UDP
More informationFun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc
References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2
More informationRunPC2_.doc
PowerBuilder 8 (5) PowerBuilder Client/Server Jaguar Server Jaguar Server Connection Cache Thin Client Internet Connection Pooling EAServer Connection Cache Connection Cache Connection Cache Connection
More informationC/C++ 语言 - 循环
C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf
More information附录一 简明Socket编程指南
附录一简明 Socket 编程指南 在本说明文档中, 主要讲述了一些网络 SOCKET 编程的基本概念和有关函数说明, 并 给出了部分示例程序的源代码 在完成 TCP 和 IP 通信程序设计实验 实时声音传输实 验 和 HTTP 代理实现实验 时, 可以参考本文档的内容 一 SOCKET 基本概念 1 Linux/Unix:Socket 函数库 Linux Socket 函数库是从 Berkeley
More information《计算机网络》实验指导书
1 实 验 一 网 络 组 建 与 管 理 一. 实 验 目 的 1. 掌 握 平 行 双 绞 线 和 交 叉 双 绞 线 的 制 作 方 法 ( 初 级 ) 2. 掌 握 对 等 网 和 代 理 服 务 器 网 络 的 组 建 ( 初 级 ) 3. 会 用 ipconfig 和 ping 命 令 ( 初 级 ) 4. 掌 握 网 络 中 文 件 夹 共 享 和 打 印 机 共 享 ( 初 级 )
More informationThe Library SysLibSockets
The Library SysLibSockets.lib...2 SysSockAccept...3 SysSockBind...3 SysSockClose...4 SysSockConnect...4 SysSockCreate...5 SysSockGetHostByName...5 SysSockGetHostName...6 SysSockGetOption...6 SysSockGetLastError...7
More informationMicrosoft Word - 01.DOC
第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的
More information穨control.PDF
TCP congestion control yhmiu Outline Congestion control algorithms Purpose of RFC2581 Purpose of RFC2582 TCP SS-DR 1998 TCP Extensions RFC1072 1988 SACK RFC2018 1996 FACK 1996 Rate-Halving 1997 OldTahoe
More informationMicrosoft Word - 11.doc
除 錯 技 巧 您 將 於 本 章 學 到 以 下 各 項 : 如 何 在 Visual C++ 2010 的 除 錯 工 具 控 制 下 執 行 程 式? 如 何 逐 步 地 執 行 程 式 的 敘 述? 如 何 監 看 或 改 變 程 式 中 的 變 數 值? 如 何 監 看 程 式 中 計 算 式 的 值? 何 謂 Call Stack? 何 謂 診 斷 器 (assertion)? 如 何
More informationLinux网络编程socket错误分析
Linux 网 络 编 程 socket 错 误 分 析 socket 错 误 码 : EINTR: 4 阻 塞 的 操 作 被 取 消 阻 塞 的 调 用 打 断 如 设 置 了 发 送 接 收 超 时, 就 会 遇 到 这 种 错 误 只 能 针 对 阻 塞 模 式 的 socket 读, 写 阻 塞 的 socket 时,-1 返 回, 错 误 号 为 INTR 另 外, 如 果 出 现 EINTR
More information第3章.doc
3 3 3 3.1 3 IT Trend C++ Java SAP Advantech ERPCRM C++ C++ Synopsys C++ NEC C C++PHP C++Java C++Java VIA C++ 3COM C++ SPSS C++ Sybase C++LinuxUNIX Motorola C++ IBM C++Java Oracle Java HP C++ C++ Yahoo
More information¶C¶L§§¬_™¨ A.PDF
1 9 3 1 9 4 / 7.1 / 1 9 5 7.2 % netstat -rn Routing tables Destination Gateway Flags Refcnt Use Interface 127.0.0.1 127.0.0.1 UH 1 132 lo0 172.16.12.0 172.16.12.2 U 26 49041 le0 1 9 6 / % ping -s almond
More information<4D6963726F736F667420506F776572506F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA4544350A1A24950D0ADD2E9BACD4950B5D8D6B72E707074>
项 目 一 : 初 识 计 算 机 网 络 任 务 三 熟 悉 TCP/IP 协 议 和 IP 地 址 一. 学 习 要 求 : 学 习 要 求 及 难 点 1. 了 解 IP 协 议 TCP 协 议 和 UDP 协 议 2. 熟 悉 IP 地 址 的 划 分 和 分 类 3. 了 解 IPV6 的 地 址 结 构 二. 难 点 : 1. IP 地 址 三. 学 时 : 1. 理 论 教 学 :6
More information( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)
( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.
More information<4D6963726F736F667420506F776572506F696E74202D2030325FC2B2B3F85FA44AAB49B0BBB4FABB50B977A8BEA874B2CEC2B2A4B6BB50C0B3A5CE2E707074>
入 侵 偵 測 與 預 防 系 統 簡 介 與 應 用 蕭 翔 之 講 師 BS 7799 LA 課 程 大 綱 第 一 章 認 識 入 侵 偵 測 與 預 防 系 統 第 二 章 入 侵 偵 測 與 預 防 系 統 的 功 能 分 類 偵 測 技 術 第 三 章 入 侵 偵 測 與 預 防 系 統 部 署 架 構 第 四 章 入 侵 偵 測 與 預 防 系 統 的 應 用 效 益 第 五 章 結
More informationPs22Pdf
26 2 2009 2 Application Research of Computers Vol. 26 No. 2 Feb. 2009 Linux IPv6 * OLSR ( 610054) IPv6 Ad hoc OLSR Linux Linux OLSR OLSR IPv6 OLSR ; OLSR ; Linux ; ; IPv6 TP393 A 1001-3695( 2009) 02-0655-
More informationuntitled
1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;
More information概述
OPC Version 1.8 build 0925 KOCRDK Knight OPC Client Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOC_Init...5 2.2.2 KOC_Uninit...5 2.3...5
More information3.1 num = 3 ch = 'C' 2
Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:
More informationC3_ppt.PDF
C03-101 1 , 2 (Packet-filtering Firewall) (stateful Inspection Firewall) (Proxy) (Circuit Level gateway) (application-level gateway) (Hybrid Firewall) 2 IP TCP 10.0.0.x TCP Any High Any 80 80 10.0.0.x
More information11N 无线宽带路由器
http://www.tenda.com.cn 1... 1 1.1... 1 1.2... 1 2... 3 2.1... 3 2.2... 3 2.3... 5 2.4... 6 2.5... 7 2.6... 9 2.6.1 无线基本设置... 9 2.6.2 无线加密设置... 9 2.7... 10 3... 18 3.1... 18 3.2... 19 3.2.1 ADSL 拨号上网设置...
More information