1. 程式人生 > >Windows Socket程式設計

Windows Socket程式設計

Windows Socket是以Unix Socket為基礎發展而來,所以很多函式與Unix/Linux下的API相同。

套接字是一條連線的兩端,每個端點由IP和埠號組成,IP標示了網路中的主機,埠號標示了IP對應的主機的某個程序,因此一個連結表示的是一個程序與一個程序間的通訊。所以Socket通訊時程序間通訊的一種方式。

TCP & UDP

TCP,Transmission Control Protocol,傳輸控制協議,面向連線、可靠的傳輸層協議,用於資料量小但安全性高的場合。
UDP,User Datagram Protocol,使用者資料報協議,面向無連線、不可靠的傳輸層協議,使用者資料量大但誤差要求不高的場合。

面向連線的套接字通訊時序圖如下:
TCP時序圖
Windows環境下,呼叫socket API需要包含windows socket動態庫

#include <winsock2.h> //<winsock.h>
#pragma  comment(lib,"WS2_32.lib")

並且在呼叫socket API之前得首先呼叫WSAStartup()以載入動態庫。

/* 
 * wVersionRequested:動態庫的版本,可使用MAKEWORD巨集組成
 * lpwsadata:返回載入的動態庫的基本資訊,如載入是否成功,實際版本等。
 */
int WSAStartup(WORD wVersionRequested,LPWSADATA lpwsadata);

關鍵型別及結構體

1. SOCKET

SOCKET被定義為一個套接字的識別符號,實際上就是一個無符整形數,用以表示不同的連線。

2. sockaddr_in

struct sockaddr_in結構體用於描述一個埠的地址資訊。定義如下:

/*
 * sin_family:使用的協議簇,AF_INET表示IP協議
 * sin_port:埠號,使用者指定,需轉換為網路字序
 * sin_addr:IP地址,結構體用以表示四位元組IP地址
 * sin_zero:零位元組填充,用以相容struct sockaddr
 */
struct sockaddr_in
{
     short
sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };

3. in_addr

/*
 * S_un_b:用四個unsigned char表示IP地址
 * S_un_w:用兩個unsigned short 表示IP地址
 * S_addr:用一個usnigned long表示IP地址
 */
struct in_addr
{
    union 
    {
        struct
        { 
            UCHAR s_b1,s_b2,s_b3,s_b4; 
        }S_un_b;
        struct
        { 
            USHORT s_w1,s_w2; 
        }S_un_w;
        ULONG S_addr;
   } S_un;
}

位元組序問題

資料儲存存在大小端問題,且不同CPU儲存資料格式不同,而資料傳輸也存在大小端問題,對於一個四位元組的資料0x12345678,大小端記憶體對應如下:

記憶體地址 0x0001 0x0002 0x0003 0x0004
大端 12 34 56 78
小端 78 56 34 12

可以看出:big-endian最直觀,little-endian最符合人的思維。
為了保證網路傳輸的統一性,TCP/IP協議規定網路資料傳輸一律採用Big-endian格式,與CPU和作業系統無關。為了實現CPU位元組序到網路位元組序的轉換,BSD socket提供了以下函式:

/* host to net(short),本機位元組序到網路位元組序轉換(short) */
uint16_t htons(uint16_t hostshort); 

/* host to net(long),本機位元組序到網路位元組序轉換(long) */
uint32_t htonl(uint32_t hostlong);

/* net to host(short),網路位元組序到本機位元組序轉換(short) */
uint16_t ntohs(uint16_t netshort);

/* net to host(long), 網路位元組序到本機位元組序轉換(long)*/
uint32_t ntohl(uint32_t netlong);

API

socket()

/* 
 * 建立套接字(server,client)
 * @af:使用的協議地址家族,TCP/UDP使用AF_INET
 * @type:套接字型別,SOCK_STREAM,SOCK_DGRAM,SOCK_RAW
 * @protocol:使用的協議,SOCK_STREAM-IPPROTO_TCP,SOCK_DGRAM-IPPROTO_UDP
 * @返回值:當建立成功時返回套接字控制代碼,失敗時返回INVALID_SOCKET
 */
SOCKET socket(int af, int type, int protocol);

bind()

/* 
 * 繫結套接字(server)
 * @s:socket建立的套接字
 * @name:待繫結的地址,該地址是指伺服器的多張網絡卡的其中一個地址,可使用INADDR_ANY不指定而由系統分配
 * @namelen:待繫結地址的長度
 * @返回值:成功返回0,可使用GetLastError()獲取錯誤程式碼
 */ 
int bind(SOCKET s, const struct sockaddr*name, int namlen);

listen()

/*
 * 監聽套接字(server)
 * @s:socket建立的監聽套接字
 * @backlog:等待連線的最大佇列長度
 * @返回值:成功返回0,可使用GetLastError()獲取錯誤程式碼
 */ 
int listen (SOCKET s,int backlog);

accept()

/*
 * 接收套接字(server) 
 * @s:監聽套接字
 * @addr:用於接收客戶端地址
 * @addlen:用於接收客戶端地址長度
 * @返回值:成功客戶端套接字控制代碼,伺服器可使用該套接字與客戶端通訊,而監聽套接字繼續監聽,可使用GetLastError()獲取錯誤程式碼
 */
SOCKET accept(SOCKET s, struct sockaddr*addr, int *addrlen);

connect()

/*
 * 連線套接字(client)
 * @s:客戶端套接字
 * @name:伺服器地址結構體指標
 * @namelen:伺服器地址結構體長度
 * @返回值:成功返回0,可使用GetLastError()獲取錯誤程式碼
 */
int connect(SOCKET s, const struct sockaddr*name, int namelen);

send()

/*
 * 傳送訊息(server,client)
 * @s:對方通訊套接字;
 * @buff:待發送訊息緩衝區;
 * @len:傳送訊息的長度;
 * @flags:傳送訊息標記。
 * @返回值:成功返回實際傳送的位元組數,否則可使用GetLastError()獲取錯誤程式碼。
 */
int send(SOCKET s,const char *buff,int len,int flags);

recv()

/*
 * 接收訊息(server,client)
 * @s:對方通訊套接字;
 * @buf:接收緩衝區;
 * @len:緩衝區長度;
 * @flags:接收訊息標記。
 * @返回值:成功返回實際接收的位元組數,否則可使用GetLastError()獲取錯誤程式碼
 */ 
int recv(SOCKET s, char *buf, int len, int flags);

close()

/* 
 * 關閉套接字(server,client)
 * @s:待關閉套接字
 * @返回值:成功返回0,可使用GetLastError()獲取錯誤程式碼
 */ 
int closesocket( SOCKET s);

錯誤資訊

巨集定義 錯誤碼 描述
WSAEINTR 10004 Interrupted function call.阻塞操作被函式WSACancelBlockingCall ()呼叫所中斷
WSAEACCES 10013 Permission denied.試圖使用被禁止的訪問許可權去訪問套接字。例如,在沒有使用函式setsockopt()的SO_BROADCAST命令設定廣播許可權的套接字上使用函式sendto()給一個廣播地址傳送資料
WSAEFAULT 10014 Bad address.系統檢測到呼叫試圖使用的一個指標引數指向的是一個非法指標地址。如果應用程式傳遞一個非法的指標值,或緩衝區長度太小,此錯誤發生。例如,引數為結構sockaddr,但引數的長度小於sizeof(struct sockaddr)
WSAEINVAL 10022 Invalid argument.提供了非法引數(例如,在使用setsockopt()函式時指定了非法的level)。在一些例項中,它也可能與套接字的當前狀態相關,例如,在套接字沒有使用listen()使其處於監聽時呼叫accept()函式
WSAEMFILE 10024 Too many open files.打開了太多的套接字。不管是對整個系統還是每一程序或執行緒,Windows Sockets實現都可能有一個最大可用的套接字控制代碼數
WSAEWOULDBLOCK 10035 Resource temporarily unavailable.此錯誤由在非阻塞套接字上不能立即完成的操作返回,例如,當套接字上沒有排隊資料可讀時呼叫了recv()函式。此錯誤不是嚴重錯誤,相應操作應該稍後重試。對於在非阻塞SOCK_STREAM套接字上呼叫connect()函式來說,報告WSAEWOULDBLOCK是正常的,因為建立一個連線必須花費一些時間
WSAEINPROGRESS 10036 Operation now in progress.一個阻塞操作正在執行。Windows Sockets只允許一個任務(或執行緒)在同一時間可以有一個未完成的阻塞操作,如果此時呼叫了任何函式(不管此函式是否引用了該套接字或任何其它套接字),此函式將以錯誤碼WSAEINPROGRESS返回
WSAEALREADY 10037 Operation already in progress.當在非阻塞套接字上已經有一個操作正在進行時,又有一個操作試圖在其上執行則產生此錯誤。如:在一個正在進行連線的非阻塞套接字上第二次呼叫connect()函式;或取消一個已經被取消或已完成的非同步請求(WSAAsyncGetXbyY())
WSAENOTSOCK 10038 Socket operation on non-socket.操作試圖不是在套接字上進行。它可能是套接字控制代碼引數沒有引用到一個合法套接字,或者是呼叫select()函式時,一個fd_set中的成員不合法
WSAEDESTADDRREQ 10039 Destination address required.在套接字上一個操作所必須的地址被遺漏。例如,如果sendto()函式被呼叫且遠端地址為ADDR_ANY時,此錯誤被返回。
WSAEMSGSIZE 10040 Message too long.在資料報套接字上傳送的一個訊息大於內部訊息緩衝區或一些其它網路限制,或者是用來接受資料報的緩衝區小於資料報本身
WSAEPROTOTYPE 10041 Protocol wrong type for socket.在socket()函式呼叫中指定的協議不支援請求的套接字型別的語義。例如,ARPA Internet UDP協議不能和SOCK_STREAM套接字型別一同指定
WSAENOPROTOOPT 10042 Bad protocol option.在getsockopt()或setsockopt()呼叫中,指定了一個未知的、非法的或不支援的選項或層(level)
WSAEPROTONOSUPPORT 10043 Protocol not supported.請求的協議沒有在系統中配置或沒有支援它的實現存在。例如,socket()呼叫請求一個SOCK_DGRAM套接字,但指定的是流協議
WSAESOCKTNOSUPPORT 10044 Socket type not supported.不支援在此地址族中指定的套接字型別。例如,socket()呼叫中選擇了可選的套接字型別SOCK_RAW,但是實現卻根本不支援SOCK_RAW型別的套接字
WSAEOPNOTSUPP 10045 Operation not supported.對於引用的物件的型別來說,試圖進行的操作不支援。通常它發生在套接字不支援此操作的套接字描述符上,例如,試圖在資料報套接字上接收連線
WSAEPFNOSUPPORT 10046 Protocol family not supported.協議簇沒有在系統中配置或沒有支援它的實現存在。它與WSAEAFNOSUPPORT有些微的不同,但在絕大多數情況下是可互換的,返回這兩個錯誤的所有Windows Sockets函式的說明見WSAEAFNOSUPPORT的描述
WSAEAFNOSUPPORT 10047 Address family not supported by protocol family.使用的地址與被請求的協議不相容。所有的套接字在建立時都與一個地址族(如IP協議對應的AF_INET)和一個通用的協議型別(如SOCK_STREAM)聯絡起來。如果在socket()呼叫中明確地要求一個不正確的協議,或在呼叫sendto()等函式時使用了對套接字來說是錯誤的地址族的地址,該錯誤返回
WSAEADDRINUSE 10048 Address already in use.正常情況下每一個套接字地址(協議/IP地址/埠號)只允許使用一次。當應用程式試圖使用bind()函式將一個被已存在的或沒有完全關閉的或正在關閉的套接字使用了的IP地址/埠號綁紮到一個新套接字上時,該錯誤發生。對於伺服器應用程式來說,如果需要使用bind()函式將多個套接字綁紮到同一個埠上,可以考慮使用setsockopt()函式的SO_REUSEADDR命令。客戶應用程式一般不必使用bind()函式–connect()函式總是自動選擇沒有使用的埠號。當bind()函式操作的是通配地址(包括ADDR_ANY)時,錯誤WSAEADDRINUSE可能延遲到一個明確的地址被提交時才發生。這可能在後續的函式如connect()、listen()、WSAConnect()或WSAJoinLeaf()呼叫時發生
WSAEADDRNOTAVAIL 10049 Cannot assign requested address.被請求的地址在它的環境中是不合法的。通常地在bind()函式試圖將一個本地機器不合法的地址綁紮到套接字時產生。它也可能在connect()、sendto()、WSAConnect()、WSAJoinLeaf()或WSASendTo()函式呼叫時因遠端機器的遠端地址或埠號非法(如0地址或0埠號)而產生
WSAENETDOWN 10050 Network is down.套接字操作遇到一個不活動的網路。此錯誤可能指示網路系統(例如WinSock DLL執行的協議棧)、網路介面或本地網路本身發生了一個嚴重的失敗。
WSAENETUNREACH 10051 Network is unreachable.試圖和一個無法到達的網路進行套接字操作。它常常意味著本地軟體不知道到達遠端主機的路由。
WSAENETRESET 10052 Network dropped connection on reset.在操作正在進行時連線因“keep-alive”檢測到失敗而中斷。也可能由setsockopt()函式返回,如果試圖使用它在一個已經失敗的連線上設定SO_KEEPALIVE
WSAECONNABORTED 10053 Software caused connection abort.一個已建立的連線被你的主機上的軟體終止,可能是因為一次資料傳輸超時或是協議錯誤
WSAECONNRESET 10054 Connection reset by peer.存在的連線被遠端主機強制關閉。通常原因為:遠端主機上對等方應用程式突然停止執行,或遠端主機重新啟動,或遠端主機在遠端方套接字上使用了“強制”關閉(參見setsockopt(SO_LINGER))。另外,在一個或多個操作正在進行時,如果連線因“keep-alive”活動檢測到一個失敗而中斷,也可能導致此錯誤。此時正在進行的操作以錯誤碼WSAENETRESET失敗返回,後續操作將失敗返回錯誤碼WSAECONNRESET。
WSAENOBUFS 10055 No buffer space available.由於系統缺乏足夠的緩衝區空間,或因為佇列已滿,在套接字上的操作無法執行。
WSAEISCONN 10056 Socket is already connected.連線請求發生在已經連線的套接字上。一些實現對於在已連線SOCK_DGRAM套接字上使用sendto()函式的情況也返回此錯誤(對於SOCK_STREAM套接字,sendto()函式的to引數被忽略),儘管其它一些實現將此操作視為合法事件。
WSAENOTCONN 10057 Socket is not connected.因為套接字沒有連線,傳送或接收資料的請求不被允許,或者是使用sendto()函式在資料報套接字上傳送時沒有提供地址。任何其它型別的操作也可以返回此錯誤,例如,使用setsockopt()函式在一個已重置的連線上設定SO_KEEPALIVE。
WSAESHUTDOWN 10058 Cannot send after socket shutdown.因為套接字在相應方向上已經被先前的shutdown()呼叫關閉,因此該方向上的傳送或接收請求不被允許。通過呼叫shutdown()函式來請求對套接字的部分關閉,它傳送一個訊號來停止傳送或接收或雙向操作。
WSAETIMEDOUT 10060 Connection timed out.連線請求因被連線方在一個時間週期內不能正確響應而失敗,或已經建立的連線因被連線的主機不能響應而失敗。
WSAECONNREFUSED 10061 Connection refused.因為目標主機主動拒絕,連線不能建立。這通常是因為試圖連線到一個遠端主機上不活動的服務,如沒有伺服器應用程式處於執行狀態。
WSAEHOSTDOWN 10064 Host is down.套接字操作因為目的主機關閉而失敗返回。套接字操作遇到不活動主機。本地主機上的網路活動沒有初始化。這些條件由錯誤碼WSAETIMEDOUT指示似乎更合適。
WSAEHOSTUNREACH 10065 No route to host.試圖和一個不可達主機進行套接字操作。參見WSAENETUNREACH。
WSAEPROCLIM 10067 Too many processes.Windows Sockets實現可能限制同時使用它的應用程式的數量,如果達到此限制,WSAStartup()函式可能因此錯誤失敗。
WSASYSNOTREADY 10091 Network subsystem is unavailable.此錯誤由WSAStartup()函式返回,它表示此時Windows Sockets實現因底層用來提供網路服務的系統不可用。使用者應該檢查:(1)是否有合適的Windows Sockets DLL檔案在當前路徑中;(2)是否同時使用了多個WinSock實現。如果有多於一個的WINSOCK DLL在系統中,必須確保搜尋路徑中第一個WINSOCK DLL檔案是當前載入的網路子系統所需要的。檢視WinSock實現的文件以確保所有必須的部件都正確地安裝並配置好了。
WSAVERNOTSUPPORTED 10092 WINSOCK.DLL version out of range.當前的WinSock實現不支援應用程式指定的Windows Sockets規範版本。檢查是否有舊的Windows Sockets DLL檔案正在被訪問。
WSANOTINITIALISED 10093 Successful WSAStartup() not yet performed.應用程式沒有呼叫WSAStartup()函式,或函式WSAStartup()呼叫失敗了。應用程式可能訪問了不屬於當前活動任務的套接字(例如試圖在任務間共享套接字),或呼叫了過多的WSACleanup()函式。
WSAEDISCON 10101 Graceful shutdown in progress.由WSARecv()和WSARecvFrom()函式返回,指示遠端方已經初始化了一個“雅緻”的關閉序列。
WSATYPE_NOT_FOUND 10109 Class type not found.指定的類沒有找到。
WSAHOST_NOT_FOUND 11001 Host not found.主機未知。此名字不是一個正式主機名,也不是一個別名,它不能在查詢的資料庫中找到。此錯誤也可能在協議和服務查詢中返回,它意味著指定的名字不能在相關資料庫中找到。
WSATRY_AGAIN 11002 Non-authoritative host not found.此錯誤通常是在主機名解析時的臨時錯誤,它意味著本地伺服器沒有從授權伺服器接收到一個響應。稍後的重試可能會獲得成功。
WSANO_RECOVERY 11003 This is a non-recoverable error.此錯誤碼指示在資料庫查詢時發生了某種不可恢復錯誤。它可能是因為資料庫檔案(如BSD相容的HOSTS、SERVICES或PROTOCOLS檔案)找不到,或DNS請求應伺服器有嚴重錯誤而返回。
WSANO_DATA 11004 Valid name, no data record of requested type.請求的名字合法並且在資料庫中找到了,但它沒有正確的關聯資料用於解析。此錯誤的通常例子是主機名到地址(使用gethostbyname()或WSAAsyncGetHostByName()函式)的DNS轉換請求,返回了MX(Mail eXchanger)記錄但是沒有A(Address)記錄,它指示主機本身是存在的,但是不能直接到達

相關推薦

Windows socket程式設計 udp協議傳送封裝自定義幀

最近在出差,要在內網做個傳送自定義幀結構的資料的程式,一時間沒做過這類東西,在網上學習了許多新的概念,也回顧了網路程式設計課上所學的關於網路位元組序的相關知識,總結如下: 自定義幀結構如下: 需要用到的東西包括子系統編號,裝置編號,資訊型別,資料體長度,資料體 作為傳送

Windows Socket程式設計之UDP實現大檔案的傳輸

前言:本文實現以下功能:在客戶端,使用者選擇本地的某個檔案,併發送到伺服器端。在伺服器端,接收客戶端傳輸的資料流,並按IP 地址儲存在伺服器端(文件名重複的,可以覆蓋)。如果傳輸過程中伺服器端發現客戶端斷開,伺服器端應刪除檔案,並在螢幕上提示,如“IP:1.2.3.4 發來a

windows Socket程式設計之重疊IO模型

上一篇文章我們講了EventSelect網路模型,它已經解決了等待資料到來的這一大部分時間,但是它還有一小部分時間沒有節省下來。那就是把資料從網絡卡的緩衝區拷貝到我們應用程式的緩衝區裡邊。而這一篇的重疊IO模型就是將這一小部分的時間也給節省了下來。 首先,我們在主執行緒裡邊

windows Socket程式設計之UDP的服務端和客戶端

上一篇講了TCP的服務端和客戶端,本篇文章來介紹一下UDP的服務端和客戶端。 相比TCP來說,UDP相對比較簡單,剛開始的時候,和TCP一樣都需要先進行網路環境的初始化,即呼叫WSAStartup函式。然後呢,我們也需要建立一個socket,這個socket和TCP的那個s

Windows Socket程式設計

Windows Socket是以Unix Socket為基礎發展而來,所以很多函式與Unix/Linux下的API相同。 套接字是一條連線的兩端,每個端點由IP和埠號組成,IP標示了網路中的主機,埠號標示了IP對應的主機的某個程序,因此一個連結表示的是一個程序

WINDOWS SOCKET程式設計中accept出來的新連線是阻塞還是非阻塞

實踐證明 SOCKET hNewSock=accept(hListenSock) 當hListenSock為阻塞模型時,hNewSock則為阻塞模型 否則 當hListenSock為非阻塞模型時,hNewSock則為非阻塞

windows socket程式設計(服務端頻繁的執行FD_CLOSE)

if(NetworkEvents.lNetworkEvents & FD_CLOSE){pGenericServer->CleanupThread(Event, s, pNewConn, GetCurrentThreadId());#ifdef GENERICSERVER_DEBUGOUTch

計算機網路課程設計——基於Windows socket程式設計的簡易聊天機器人

1.瞭解基本的socket API函式 WSAStartup()和WSACleanup()函式的關係 WSAStartup()函式 WSACleanup()函式 socket()函式 功能是建立套接字,客戶端和服務端都要呼叫的函式,產生各自

Windows Socket 程式設計 伺服器端 可多使用者連線

                                          效果圖 一、介紹       VC6下編譯通過,監聽797埠(自己隨便設定的一個),每當有客戶端連線時就建立一個新執行緒接收這個客戶端傳送的訊息,客戶端離開時程序結束,接收到客戶端的訊息後

Windows Socket程式設計之TCP實現大檔案的傳輸

前言: 本文實現以下功能: 在客戶端,使用者選擇本地的某個檔案,併發送到伺服器端。 在伺服器端,接收客戶端傳輸的資料流,並按IP 地址儲存在伺服器端(文 件名重複的,可以覆蓋)。 如果傳輸過程中伺服器端發現客戶端斷開,伺服器端應刪除檔案,並在螢幕 上提示,如“IP:1.

Windows Socket 程式設計_單個伺服器對多個客戶端簡單通訊

單個伺服器對多個客戶端程式: 一。簡要說明 二。檢視效果 三。編寫思路 四。程式原始碼 五。存在問題 一。簡要說明:  程式名為:TcpSocketOneServerToMulClient  程式功能:實現單個伺服器對多個客戶端通訊功能的小程式。 PS: 這是繼上次簡單的

windows socket程式設計實現兩臺電腦間的通訊

首先需要兩臺電腦,可以兩個同學共同來完成;當然,如果自己有兩臺電腦的話就更好了! 在一臺電腦上建立一個TCP Socket伺服器應用程式 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include

windows socket程式設計入門示例1

/// tcpSocketClient.cpp #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") #define IP_ADDRESS "127.0

windows socket程式設計總結

windows的網路程式設計介面沒有像linux那麼豐富,功能也要少很多,下面針對幾個主要的介面做一下介紹: 1.  int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData); 這個函式比較簡單,目的是初始化so

Windows網路程式設計(二):Socket簡介

Socket簡介 Socket被稱為套接字,描述了IP和埠等資訊,是一個通訊鏈的控制代碼。 微軟專門開發了一套支援多種網路協議的網路程式設計介面,叫做Winsock,Winsock是Windos SDK的一部分,全稱Windows Sockets API。它對多種協議做了封裝,S

Windows Socket套接字(三)-MFC套接字程式設計

同步:指傳送方發出資料後,等收到接收方發回的響應,才發下一個數據包的通訊方式 非同步:指的是傳送方不等接收方響應,便接著發下個數據包的通訊方式; 阻塞:指呼叫某函式時,直到該函式完成操作,才返回;否則一直阻塞在該呼叫上 非阻塞:指呼叫某操作時,不管操作是否成功都立即返回,而不

windows環境下的socket程式設計(tcp檔案傳輸的實現)

開發環境 使用codeclock軟體進行程式設計 新建專案選擇console application完成相應的步驟即可。在專案下有main.c的檔案只需要將程式碼寫入其中即可。 程式碼設計 客戶端 client #include <std

【 專欄 】- windows socket 網路程式設計系列

如果你對我的部落格有任何的意見和建議或是想和我交流技術、學習和生活,請和我聯絡!!;QQ:979840319;[email protected] ; windbg軟體除錯交流群:128417096

Windows C語言 Socket程式設計 server端(伺服器)--初級(多客戶端——初級版)

看過我的簡單版的伺服器程式碼的,會發現那段程式碼同一時間只能和一個客戶端通訊。這樣的程式碼能力很小侷限性很大。今天我來介紹一種多客戶端的伺服器程式碼。當然這段程式碼還是有問題的,至於是什麼問題我會在程式碼後面說清楚。 我的這個多客戶端的程式碼核心思想是多執行緒

Windows下進行Socket程式設計問題

做Windows網路程式設計經常遇到下面這種情況: c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: “fd_set”: “str