當前位置:首頁 » 編程軟體 » winsock編程

winsock編程

發布時間: 2022-06-14 10:18:27

① winsock編程

當然是配套的,需要約定彼此之間的通訊協議
比如一個簡單的,我發4個位元組給你,因為是約定好的,你知道我共發了4個位元組,所以按約定只接收4個位元組,然後你發8個位元組給我,也是因為約定好的,所以我只接收8個位元組,不多也不少,這就是一種協議。

由此,伺服器和客戶機定義的傳送類型是否要相同,也就明白了,
也就是說,發送方和接收方的傳送類型必須一致,不管伺服器和客戶機誰做發送方,誰做接收方,只要是在一次通訊,一方發送,一方接收時,這時雙方的類型必須一致。

② C++ Winsock編程

(一)調用約定
VC++5.0支持的函數調用約定有多種,在這里僅討論以下三種:__stdcall調用約定、C調用約定和__fastcall調用約定。
__stdcall調用約定相當於16位動態庫中經常使用的PASCAL調用約定。在32位的VC++6.0中PASCAL調用
約定不再被支持(實際上它已被定義為__stdcall。除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall調用約定。兩者實質上是一致的,即函數的參數自右向左通過棧傳遞,被調用的函數在返回前清理傳送參數的內存棧,但不同的是函數名的修飾部分(關於函數名的修飾部分在後面將詳細說明)。
C調用約定(即用__cdecl關鍵字說明)和__stdcall調用約定有所不同,雖然參數傳送方面是一樣的,但對於傳送參數的內存棧卻是由調用者來維護的(也正因為如此,實現可變參數的函數只能使用該調用約定),另外,在函數名修飾約定方面也有所不同。
__fastcall調用約定是「人」如其名,它的主要特點就是快,因為它是通過寄存器來傳送參數的(實際上,它用CX和EDX傳送前兩個雙字或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧),在函數名修飾約定方面,它和前兩者均不同。
關鍵字 __stdcall、__cdecl和__fastcall可以直接加在要輸出的函數前,也可以在編譯環境的Setting...\C/C++ \Code Generation項選擇。當加在輸出函數前的關鍵字與編譯環境中的選擇不同時,直接加在輸出函數前的關鍵字有效。它們對應的命令行參數分別/Gz、/Gd和/Gr。預設狀態為/Gd,即__cdecl。
順便說明一下,要完全模仿PASCAL調用約定首先必須使用__stdcall調用約定,至於函數名修飾約定,可以通過其它方法模仿。還有一個值得一提的是WINAPI宏,Windows.h支持該宏,它可以將輸出函數翻譯成適當的調用約定,在WIN32中,它被定義為__stdcall。
建議:使用WINAPI宏,這樣你就可以創建自己的APIs了。

near指針和far指針
在DOS下(實模式)地址是分段的,每一段的長度為64K位元組,剛好是16位(二進制的十六位)。
near指針的長度是16位的,所以可指向的地址范圍是64K位元組,通常說near指針的定址范圍是64K。
far指針的長度是32位,含有一個16位的基地址和16位的偏移量,將基地址乘以16後再與偏移量相加,(所以實際上far指針是20位的長度。)即可得到far指針的1M位元組的偏移量。所以far指針的定址范圍是1M位元組,超過了一個段64K的容量。例如一個far指針的段地址為0x7000,偏移量為0x1244,則該指針指向地址0x71224.如果一個far指針的段地址是0x7122,偏移量為0x0004,則該指針也指向地址0x71224。
如果沒有指定一個指針是near或far,那麼默認是near。所以far指針要顯式指定。far指針工作起來要慢一些,因為每次訪問一個far指針時,都要將數據段或程序段的數據交換出來。另外,far指針的運算也比較反常,例如上面講到的far指針指向同一個地址,但是比較的結果卻不相同。

9、什麼時候使用far指針
當使用小代碼或小數據存儲模式時,不能編譯一個有很多代碼或數據的程序。因為在64K的一個段中,不能放下所有的代碼與數據。為了解決這個問題,需要指定以far函數或far指針來使用這部分的空間(64K以外的空間)。許多庫函數就是顯式地指定為far函數的形式。far指針通常和farmalloc()這樣的內存分配函數一起使用

如果想深入了解這方面的知識去找找羅雲彬的《Windows環境下32位匯編語言程序設計》。看了你就知道widows水有多深了。

③ 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫

需要用到的頭文件包含:

#include <winsock2.h>

#include <windows.h>

與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫

Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:

Winsock 1:

Windows CE平台支持。

頭文件:WinSock.h

庫:wsock32.lib

Winsock 2:

部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;

頭文件:WinSock2.h

庫:ws2_32.lib

mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll

(3)winsock編程擴展閱讀

winsock庫的載入與卸載:

載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

載入成功,返回值為0。

WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~

LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。

卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。

④ C++ Winsock編程怎麼學

具體到編程,用java來實現網路編程是很容易的,可以作為網路編程的入門。使用C++和winsock相對復雜一些。總之看實際需要了。 你好初學網路編程者可以從以下幾個步驟開展:1)下載一個可以互動的學習工具,通過這個與這個工具互動,我們可以及時的學到每個api的結果如果。我個人強烈推薦一個互動好工具,即python,下載地址
對於有c/c++或java基礎的朋友通過一兩個禮拜的時間就可以上手了,另外個人建議初學者可以學習dive into python。2)掌握網路編程中會用到的幾個基本概念和內涵,比如IP地址,port號,socket等3)記住和消化網路編程C/S模型,把server和client端編程的常用模式理解和消化4)花幾天時間學習socket api集,api集可以分為下面幾大類:創建 socket bind listen accept收發 read/recv/recvfrom write/send/sendto關閉 close shutdown參數 getsockopt/setsockopt地址 gethostbyaddr getaddrbyhost,...在學習這些api時候,可以先關注在函數功能,參數意義上5)結合python互動平台,實踐socket api的用法,比如socket函數怎麼使用,bind怎麼使用等等。在互動過程中,我們可以變換參數,看看調用結果如何。比如,創建一個tcp socket的語法如下:socket(AF_INET,SOCK_STREAM)創建一個udp socket的語法如下:socket(AF_INET,SOCK_DGRAM)6)學習socket server端編程實現簡單規約比如echo,time等,然後通過cmd中的telnet來測試。7)學習I/O模型,比如阻塞、非阻塞和反應式(select,poll,WaitForMultipleObject)等8)學習Richard Stevens的《Unix網路編程》,深入學習其中的api原理以及服務端設計原理,並通過代碼編寫。9)下載高性能網路編程框架twisted,筆者強烈推薦,它將使你的網路編程效率提高10倍以上。10)學習設計模式、操作系統知識比如線程、進程、同步等。鄰家阿獃 回答採納率:29.0% 2008-12-18 09:55檢舉我是高手,我可以教你1.明確學習目的學習編程對大多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學習編程還能 鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。2.打好基礎學編程要具備一定的基礎,總結之有以下幾方面:(1)數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。(2)邏輯思維能力的培養 學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。

⑤ Winsock編程基礎白痴問題!

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()

Microsoft html" class="UBBWordLink">Windows-specific Extensions 函式包括:
WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()

這些 API 介面適用於 Internet Protocol Suite (IPS,通常稱之為 TCP/IP),
支援 Stream (TCP) 及 Datagram (UDP) Socket。

Stream (TCP) Socket 提供「雙向」、「可靠」、「有次序」、「不重覆」之資料傳送。
Datagram (UDP) Socket 則提供「雙向」之溝通,但沒有「可靠」、「有次序」、「不重覆」等之保證; 所以使用者可能會收到無次序、重覆之資料,甚至資料在傳輸過程中也可能會遺漏。

[Blocking 與 Non-blocking 模式]

Blocking 模式:使用者呼叫此一模式之函式時,會進入此函式之內部,直到條件或資料完全符合時再回到呼叫點。

Non-blocking 模式:使用者呼叫此一模式之函式時,進入此函式之內部,依當時之條件或資料做適當之回覆,並不會停留在函式之內部到條件或資料完全符合後才回應。

使用者必需注意的是,html" class="UBBWordLink">WINSOCK 定義之 Blocking 模式與一般 Unix 的不太相同。html" class="UBBWordLink">WINSOCK定義允許應用程式在呼叫 Blocking 函式的同時,依舊能夠處理其它訊息 (Messages),包括Keyboard 及 Mouse 的事件;但是此時應用程式除了能用 WSACancelBlockingCall() 函式來取消原先之 locking 動作或用WSAIsBlocking() 函式來檢查目前是否有 Blocking 動作仍在進行外,不可以」在原先呼叫之Blocking 函式完成前再呼叫其它的 Socket 函式,不然後者會失敗且產生WSAINPROGRESS 的錯誤。

使用者呼叫 WSACancelBlockingCall()函式所取消的 Blocking 動作若不是accept() 或者 select()的話,那麽之後唯一可呼叫的 Socket 函式只有closesocket(),因為取消一個 Socket 的Blocking 動作會使其變成未定(Indeterminate) 狀態。

[Async (非同步) 模式]

使用者呼叫此一模式的函式時,並不會馬上得到要求的資料;而是當要求的動作完成後,系統再透過另一種方式來通知呼叫者。其好處是使用者不需等到答覆後才可以再做其它的動作或要求。
html" class="UBBWordLink">WINSOCK定義的 Async 模式是以「PostMessage」的方式告知使用者其要求已經完成;所以在呼叫此類函式時,必須告知 html" class="UBBWordLink">Windows Sockets DLL一些資訊,包括接受訊息的視窗 handle及訊息編號等。

[函式概說]

[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;那麽html" class="UBBWordLink">Windows Sockets 會自動將其設定適當之位址及 Port(1024 到 5000之間的值),使用者可以在此 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 );
參 數: 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的某些狀態設定值。 html" class="UBBWordLink">WINSOCK 提供之 level 只有 SOL_SOCKET 及 IPPROTO_TCP optname則有以下 之選擇:(參見html" class="UBBWordLink">WINSOCK 第 29、30 頁之定義)
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 );
參數: cp 一個代表位址的「點格式」(dotted) 字串
傳回值: 成功 - 一個代表 Internet 位址的 unsigned long
失敗 - INADDR_NONE
說明: 此函式將一「點格式」的位址字串轉換成適用之Intenet位址。
「點格式」字串可為以下四種方式之任一:
(i) a.b.c.d (ii) a.b.c (iii) a.b (iv) a

⑥ WinSock網路編程問題(VC++)

你已經定義好了長度,接收端當然是按這個長度設置了緩沖區大小了。
想復雜了,沒這么麻煩。
你就設置一個256個BYTE的的用戶緩沖區,你一次就讀256。第一次讀,先讀信息長度,然後根據這個長度去循環讀就行了,直到讀完為止。下一次接收,先看用戶緩沖區里還有沒有數據,有就仍然先從這個緩沖區里先讀,後面方法是一致的。

補充:我說這個讀取是邏輯的,你肯定先要READ完存放在定義的緩存區里,然後我說的讀取指的是讀緩存區里的。因為頭部已經在緩存里了,你只要去讀緩存區前幾個位元組就知道緩存區里有多少個BYTE是有效的。其他的讀取都是建立在這個緩存區上的,IO當然是一次完成

⑦ vc++ winsock編程

這是程序的設計問題。所有的窗口將消息匯總至統一的函數,然後統一處理,所以肯定不會每個窗口對應一個 socket 埠。

例如窗口發送消息定義為:
sendmsg(窗口編號,接受者qq號,消息內容);
那麼,實際執行時,
窗口1
sendmsg("12345", "你好");
窗口2
sendmsg("2345678", "吃飯了嗎");
窗口3
sendmsg("98765432「, "我下課了");
然後關鍵的發送函數類似這樣寫:
function sendmsg(toqq, msg)
{
// 根據 socket 連接情況,將 msg 發送到 toqq
}

對於接收到的消息,根據發送者的 qq 號碼,可以找到是哪個聊天窗口,然後發送給相關窗口。

⑧ winsock編程有沒有辦法讓connect函數立刻返回

Socket中如何設置連接超時
AntGhazi/2001.12.14 主頁:antghazi.yeah.net

把CSDN與中文yahoo翻了底朝天,也沒找到如何設置socket的連接超時的滿意方法,問此問題的兄弟已有一大堆,這里偶就講一下win下如何設置socket的connect超時。
設置connect的超時很簡單,CSDN上也有人提到過使用select,但卻沒有一個令人滿意與完整的答案。偶所講的也正是select函數,此函數集成在winsock1.1中,簡單點講,"作用使那些想避免在套接字調用過程中被鎖定的應用程序,採取一種有序的方式,同時對多個套接字進行管理" (《Windows網路編程技術》原話)。使用方法與解釋請見《Windows網路編程技術》。
在使用此函數前,需先將socket設置為非鎖定模式,這樣,在connect時,才會立馬跳過,同時,通常也會產生一個WSAEWOULDBLOCK錯誤,這個錯誤沒關系。再執行select則是真正的超時。

WSADATA wsd;
SOCKET cClient;
int ret;
struct sockaddr_in server;
hostent *host=NULL;

if(WSAStartup(MAKEWORD(2,0),wsd)){return 0;}
cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(cClient==INVALID_SOCKET){return 0;}
//set Recv and Send time out
int TimeOut=6000; //設置發送超時6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
TimeOut=6000;//設置接收超時6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
//設置非阻塞方式連接
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)ul);
if(ret==SOCKET_ERROR)return 0;

//連接
server.sin_family = AF_INET;
server.sin_port = htons(25);
server.sin_addr .s_addr = inet_addr((LPCSTR)pSmtp);
if(server.sin_addr.s_addr == INADDR_NONE){return 0;}

connect(cClient,(const struct sockaddr *)server,sizeof(server));

//select 模型,即設置超時
struct timeval timeout ;
fd_set r;

FD_ZERO(r);
FD_SET(cClient, r);
timeout.tv_sec = 15; //連接超時15秒
timeout.tv_usec =0;
ret = select(0, 0, r, 0, timeout);
if ( ret <= 0 )
{
::closesocket(cClient);
return 0;
}
//一般非鎖定模式套接比較難控制,可以根據實際情況考慮 再設回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)ul1);
if(ret==SOCKET_ERROR){
::closesocket (cClient);
return 0;
}

--------------------------------------------------------------------------------------------------------------

LINUX下的方法:

在阻塞套接字的一般情況下,connect ()直到客戶端對SYN消息的ACK消息到達之前才會返回。使connect()調用具有超時機制的一個方法是讓套接字成為非阻塞的套接字體,然後用select()來等待它完成。
[code:1:7901c37cf2]
s = socket(AF_INET, SOCK_STREAM, 0);
//下面獲取套接字的標志
if ((flags = fcntl(s, F_GETFL, 0)) < 0) {
//錯誤處理
}

//下面設置套接字為非阻塞
if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) {
//錯誤處理
}

if ((retcode = connect(s, (struct sockaddr*)peer, sizeof(peer))
errno != EINPROGRESS) {
//因為套接字設為NONBLOCK,通常情況下,連接在connect()返回
//之前是不會建立的,因此它會返回EINPROGRESS錯誤,如果返回
//任何其他錯誤,則要進行錯誤處理
}

if (0 == retcode) { //如果connect()返回0則連接已建立
//下面恢復套接字阻塞狀態
if (fcntl(s, F_SETFL, flags) < 0) {
//錯誤處理
}

//下面是連接成功後要執行的代碼

exit(0)
}

FD_ZERO(rdevents);
FD_SET(s, rdevents); //把先前的套接字加到讀集合裡面
wrevents = rdevents; //寫集合
exevents = rdevents; //異常集合

tv.tv_sec = 5; //設置時間為5秒
tv_tv_usec = 0;

retcode = select(s+1, rdevents, wrevents, exevents, tv);
if (retcode < 0) { //select返回錯誤???
//錯誤處理
}
else if (0 == retcode) { //select 超時???
//超時處理
}
esle {
//套接字已經准備好
if (!FD_ISSET(s, rdevents) !FD_ISSET(s, wrevents)) {
//connect()失敗,進行錯處理
}

if (getsockopt(s, SOL_SOCKET, SO_ERROR, err, len) < 0) {
//getsockopt()失敗,進行錯處理
}

if (err != 0) {
//connect()失敗,進行錯處理
}

//到這里說明connect()正確返回
//下面恢復套接字阻塞狀態
if (fcntl(s, F_SETFL, flags) < 0) {
//錯誤處理
}

//下面是連接成功後要執行的代碼

exit(0)

⑨ .net編程和基於WINsock的網路編程有什麼區別

.NET編程是基於C#語音的網站開發。裡面很少涉及到自己編寫代碼實現網路通信的。
而WINsock編程主要是負責開發網路通信功能的。屬於SDK編程的一部分。用C++或VC實現的居多,主要是用開發商提供的一個叫winsock1.1或winsock2.0的庫文件實現。
希望對你有幫助

⑩ 什麼是網路編程啊

呵呵,網路編程。我舉些例子來解釋吧,例如你看到的某些網站,他們的連接地址有的時候你會發現結尾的時候有jsp或者asp吧,這些就是網路編程,這樣編程的網頁叫動態頁面。
還有你肯定知道qq吧,這樣的聊天軟體也是網路編程,還有聊天室什麼的,這類都是。普通的編程是什麼樣子呢,還是給你舉個例子,如:我們電上操作系統上的畫圖,計算器,這都是普通軟體。這么說吧,游戲有網路游戲和單機游戲,網路游戲是面對多人的,單機游戲只能是單人的去玩,那麼編程也是這個道理了。
c++貌似不是網路編程,可以說現在這種語言只能是基礎了,但是往深里學也很強大,比如windows操作系統就有c++語言的參入。
.net的話不是語言,是操作平台,也就是編程工具,你要是在網路上查的話一會發現有.net2003和.net2005的版本等。
微軟方面的網路編程語言我知道的是c#,別的不知道有沒有了。
個人理解,心得,希望能幫到你

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:333
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:375
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:610
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:31
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:940
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:739
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:802
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:510
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371