當前位置:首頁 » 編程軟體 » c網路通信編程

c網路通信編程

發布時間: 2022-06-22 02:37:09

c語言網路編程主要工作內容是什麼

在c語言中 !代表 邏輯運算符非,5 是非0 , 所以 !5 表示 0。 C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

❷ C/C++如何網路編程

編程方面推薦你看下SOCKET C API,這是所有網路編程的基礎。
現在大部分通信都是基於TCP/IP協議, 建議你看下 這方面的書籍,這里很難講清楚。

❸ c語言網路編程

可以,不過C語言擅長的是邏輯處理和底層交互,頁面展現用C就太麻煩了

如果是網路方面的編程,建議你看看套介面Socket方面的書,最好在Linux下面,在Win下面就用wsock32的知識

❹ c語言的網路編程特點有哪些(在線等待,答得好馬上給分!)

1、你說得用C語言開發網路程序,一定指的是在WIN/UNIX/LINUX/SOLARIS/FreeBSD等多進程/多線程操作系統下的編程,網路編程是基於B/S或者C/S架構的,無論那種,S都需要有多線程或者子進程的處理與客戶端通信的能力,DOS下的C是不具備這個能力。另外,網路程序是對操作系統多線程/多進程能力要求很高的應用,所以UNIX下的C編程能很好的滿足要求。
2、網路編程只要遵從一種協議,語言是沒有限定的,比較各種語言編寫的網路應用的特點,歸根結底還是回到這種語言已經它存在的操作系統的特點。相比與其他語言開發的網路程序,用UNIX/SOKCET/C這種模式開發的網路應用能最大限度的利用系統資源,同時兼備UNIX的穩定性和C的高效率,是大型網路應用經常採用的方式,例如著名的freeBSD,大量的論壇都是這樣的方式。很多網路應用,離開UNIX和C,在重連接負荷的情況下是無法工作的。
3、但是由於高效與通用是一對矛盾,UNIX/C開發的網路應用,比較靠近系統底層,代碼的可移植性、可重用性相對於使用winsock編程的WINDOWS/C++方案的網路應用要差一些,windows的MFC已經對網路協議做了很多層的封裝,使用C++來繼承可以節省大量開發時間。
4、結論,如果你想開發自己全新的網路應用/協議,並且要承擔很重的用戶訪問負荷,那麼你可以用C,而且操作系統要用UNIX/LINUX,如果你僅僅希望用已經成熟的internet協議寫一些界面漂亮的網路應用,推薦你用WINDOWS/C++方式。

❺ 在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

(5)c網路通信編程擴展閱讀

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#如何實現網口通訊

網口通迅啊,你的意思是通過網路和別的計算機通信嗎?如果是的話那就是socket通信了,我給你個例子看看
伺服器端:
try
{
int port = 2000;
string host = "176.64.158.112";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創建一個Socket類
s.Bind(ipe);//綁定2000埠
s.Listen(0);//開始監聽
ShowMessage("Waitforconnect");
while (true)
{
Socket temp = s.Accept();//為新建連接創建新的Socket。
ShowMessage("Getaconnect from " + temp); //this.Invoke(new ShowMes(ShowMessage), "Getaconnect");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息
recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
ShowMessage(String.Format("ServerGetMessage:{0}", recvStr));//this.Invoke(new ShowMes(ShowMessage), String.Format("ServerGetMessage:{0}", recvStr)); //把客戶端傳來的信息顯示出來
string sendStr = "Ok!ClientSendMessageSucessful!";
byte[] bs = Encoding.ASCII.GetBytes (sendStr);
temp.Send(bs, bs.Length, 0);//返回客戶端成功信息
}
//temp.Close();
//s.Close();
}
catch (ArgumentNullException e)
{
ShowMessage(String.Format("ArgumentNullException:{0}", e));
}
catch (SocketException e)
{
ShowMessage(String.Format("SocketException:{0}", e));
}
Console.WriteLine("PressEntertoExit");
客戶端:
try
{
Socket c;
int port = 2000;
string host = "176.64.158.112";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和埠轉化為IPEndPoint實例
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創建一個Socket
ShowMessage("Conneting...");
c.Connect(ipe);//連接到伺服器
string sendStr = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
ShowMessage("SendMessage");
c.Send(bs, bs.Length, 0);//發送測試信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//從伺服器端接受返回信息
if (bytes <= 0)
break;
recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
ShowMessage(String.Format("ClientGetMessage:{0}", recvStr));//顯示伺服器返回信息
sendStr = "hello!This is a socket test";
bs = Encoding.ASCII.GetBytes(sendStr);
ShowMessage("SendMessage");
c.Send(bs, bs.Length, 0);//發送測試信息
Thread.Sleep(100);
c.Close();
}
catch (ArgumentNullException e)
{
ShowMessage(String.Format("ArgumentNullException:{0}", e));
}
catch (SocketException e)
{
ShowMessage(String.Format("SocketException:{0}", e));
}
ShowMessage(String.Format("PressEntertoExit"));

❼ C語言網路編程

路由器本身不具備數據保存能力。
通常,路由器的功能是埠轉發。在路由器建立埠映射(公網某埠和內網某台電腦的某埠關聯)後,外網電腦才能和內網某電腦進行通信,通信過程中路由器一直負責數據的中轉。但內網電腦一旦關閉連接,路由器是無法單獨收取並保存信息的,它會直接把斷連事件通知給連接的另一端(外網某電腦)。

例如你的情況,如果區域網里是作為伺服器S(監聽方),外網某電腦作為客戶端C(連接方)。
S程序本身監聽埠2014,而C要連接的是路由器在公網的12345埠。
設路由器在公網IP是123.124.125.126,S的內網IP是192.168.1.1。
這時需要對路由器進行手動配置,讓路由器能將公網的12345埠和內網192.168.1.1這台電腦的2014映射關聯。
這時,內網192.168.1.1上的S對2014進行監聽(就用bind然後listen),路由器會反映到公網上,於是在公網看來,就是」電腦「123.124.125.126在對12345進行監聽。
而如果外網連接123.124.125.126:12345(注意冒號),路由器會將這個連接請求轉化成對192.168.1.1:2014(注意冒號)的連接請求,於是S就會收到連接,能用accept接受它。
後面都和區域網編程一樣了。
有問題請繼續追問。

❽ 請教關於C++網路通信編程

我這段時間也在學網路編程,給推薦本書<<unix網路編程>>,個人感覺這才是正宗,雖然很多,但是沒有哪一門學問能以兩天就能學成的,慢慢來。windows上的東西,次,因為你要搞網路編程就免不了要做伺服器,通常伺服器上有多少公司敢用windows.

至於實習,我真的還沒有聽說過哪個單位招實習生要看人家的作品,通常你只需要講出大概能容就可以了。

❾ 200分,C++網路通信,高手,工作過的進!!

朋友!!!我感覺應該如下
CSocket是MFC在CAsyncSocket基礎上派生的一個同步阻塞Socket的封裝類。它是如何又把CAsyncSocket變成同步的,而且還能響應同樣的Socket事件呢? 其實很簡單,CSocket在Connect()返回WSAEWOULDBLOCK錯誤時,不是在OnConnect(),OnReceive()這些事件終端函數里去等待。你先必須明白Socket事件是如何到達這些事件函數里的。這些事件處理函數是CSocketWnd窗口對象回調的,而窗口對象收到來自Socket的事件,又是靠線程消息隊列分發過來的。總之,Socket事件首先是作為一個消息發給CSocketWnd窗口對象,這個消息肯定需要經過線程消息隊列的分發,最終CSocketWnd窗口對象收到這些消息就調用相應的回調函數(OnConnect()等)。 所以,CSocket在調用Connect()之後,如果返回一個WSAEWOULDBLOCK錯誤時,它馬上調用一個用於提取消息的函數PumpMessage(...),就是從當前線程的消息隊列里取關心的消息. PumnMessage會遇到下面幾種情況: 1 提取出了(從消息隊列中移出來Remove),用戶正在使用的一個Socket發送的WM_SOCKET_NOTIFY消息和對應的 FD_XXX事件,返回True. 2 提取出了(從消息隊列中移出來Remove),用戶正在使用的一個Socket發送的WM_SOCKET_NOTIFY消息和對應的 FD_Close事件,返回True. 3 提取出了(從消息隊列中移出來Remove),PumpMessage(..)設定的定時器的WM_TIMER消息,TimeOut事件為 CSocket的一個成員變數,m_nTimeOut=2000ms,返回True 4 用戶調用了CancelBlockingCall() 設置錯誤代碼為WSAEINTR(被中斷了),返回False 5 用戶一直沒有取到用戶正在使用的一個Socket發送的WM_SOCKET_NOTIFY消息和對應的FD_XXX事件,但是取到 了同一個線程中的其他Socket的WM_SOCKET_NOTIFY消息及其對應的消息,則將這些消息,加入到一個輔助性 的隊列中去,以後處理. 6 沒有取到任何WM_SOCKET_NOTIFY消息,則開始查看(不是取出來,而是查看)本線程的消息隊列中是否有其他 消息,如果有的話,調用虛函數OnMessagePending(),來處理這些消息(OnMessagePending()用戶可以自定義 在阻塞時,用戶想要處理的消息),如果沒有,則調用WaitMessage()開始等待消息的到來. 代碼說明如下: A 先看Connect,因為Connect的阻塞的實現和Accept,Receive,ReceiveFrom,Send,SendTo都有點不同. 也許你們會奇怪為何是ConnectHelper(...),而不是Connect(...).其實ConnectHelper(...)才是Connect(..) 真正調用的東西,如下: BOOL CAsyncSocket::Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen) { return ConnectHelper(lpSockAddr, nSockAddrLen); } //ConnectHelper( ... )為一虛函數 //繼承自CAsyncSocket,Csocket有重新定義過. //這也是為什麼CSocket是Public繼承的原因 BOOL CSocket::ConnectHelper( ... ) { //一旦調用 就先檢查當前是否有一個阻塞操作正在進行 //如果是,立馬返回,並設置錯誤代碼. ...... ...... m_nConnectError = -1; //注意它只調用了一次CAsyncSocket::ConnectHelper( ... ) if( !CAsyncSocket::ConnectHelper( ... ) ) { //由於Connect(...)要求自己和Server進行三步握手 //即需要發送一個Packet,而且等待回復(這個也就是 //涉及連接和發送數據操作的Socket API會阻塞的原因) //所以CAsyncSocket::ConnectHelper(...)會立即返回, //並且設置錯誤為WSAEWOULDBLOCK(調用該函數會導致阻塞) if( WSAGetLastError() == WSAEWOULDBLOCK ) { //進入消息循環,以從線程消息隊列里查看FD_CONNECT消息, //收到FD_CONNECT消息(在PumpMessage中會修改m_nConnectError),返回 //或者WM_TIMER/FD_CLOSE(return true,但不會修改m_nConnectError), //繼續調用PumpMessage來取消息 //或者錯誤,那麼就返回socket_error while( PumpMessages( FD_CONNECT ) ) { if (m_nConnectError != -1) { WSASetLastError(m_nConnectError); return (m_nConnectError == 0); } } //end while } return false; } return true; } //在PumpMessages中會設置一個定時器,時間為m_nTimeOut=2000ms //當在這個時間之內,依然沒有得到消息的話,就返回 BOOL CSocket::PumpMessages( UINT uStopFlag ) { //一旦進入這個函數,就設置Socket當前狀態為阻塞 BOOL bBlocking = TRUE; m_pbBlocking = &bBlocking; .................... ..................... .................... CWinThread* pThread = AfxGetThread(); //bBlocking是一個標志, // 用來判斷用戶是否取消對Connect()的調用 //即是否調用CancelBlockingCall() while( bBlocking ) { //#define WM_SOCKET_NOTIFY 0x0373 //#define WM_SOCKET_DEAD 0x0374 MSG msg; //在此處只是取WM_SOCKET_NOTIFY 和 WM_SOCKET_DEAD消息 if (::PeekMessage(&msg, pState->m_hSocketWindow,WM_SOCKET_NOTIFY, WM_SOCKET_DEAD, PM_REMOVE)) { if (msg.message == WM_SOCKET_NOTIFY && (SOCKET)msg.wParam == m_hSocket) { //這個是PumpMessage的第2種情況 if (WSAGETSELECTEVENT(msg.lParam) == FD_CLOSE) { break;} //這個是PumpMessage的第1種情況 if(WSAGETSELECTEVENT(msg.lParam) == uStopFlag ) { ......; break;} } //這個是PumpMessage的第5種情況 if (msg.wParam != 0 || msg.lParam != 0) CSocket::AuxQueueAdd(msg.message, msg.wParam, msg.lParam); } //這個是PumpMessage的第3種情況 else if (::PeekMessage(&msg, pState->m_hSocketWindow,WM_TIMER, WM_TIMER, PM_REMOVE)) { break;} //這個是PumpMessage的第6種情況 if (bPeek && ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (OnMessagePending()) { } else { WaitMessage(); ..... } } }//end while ////這個是PumpMessage的第4種情況 if (!bBlocking) { WSASetLastError(WSAEINTR); return FALSE; } m_pbBlocking = NULL; //將WM_SOCKET_NOTIFY消息發送到Creat CSocketWnd線程的消息隊列中 //以便處理其他的Socket消息 ::PostMessage(pState->m_hSocketWindow, WM_SOCKET_NOTIFY, 0, 0); return TRUE; } B 再看Receive(..) //其實CSocket的這種實現方式決定了,應用程序不能夠在一個線程中Create一個socket, //然後創建一個新的線程來專門Receive,因為這個新的線程將永遠不能取到FD_Read的事件, //因為並不是在這個線程中創建的CSocketWnd對象,它無法接受到發送到CSocketWnd的消息 //(在Windows中接受消息的主體是窗口) //Receive和Connect的實現方式的最大區別為 //Connect 是不斷的調用PumpMessage(..) //而Receive則不斷的調用自身 int CSocket::Receive(void* lpBuf, int nBufLen, int nFlags) { if (m_pbBlocking != NULL) { WSASetLastError(WSAEINPROGRESS); return FALSE; } int nResult; while ((nResult = CAsyncSocket::Receive(lpBuf, nBufLen, nFlags)) == SOCKET_ERROR) { if (GetLastError() == WSAEWOULDBLOCK) { //一旦提取到FD_READ///FD_CLOSE///WM_TIMER時 // 就再次調用CAsyncSocket::Receive(...) if (!PumpMessages(FD_READ)) return SOCKET_ERROR; } else return SOCKET_ERROR; } return nResult; } 最後,總結一下自己對CSocket的看法, 1 雖然它解決了結束阻塞線程的方法,調用CancelBlockingCall,但是多線程模式根本就不適合於CSocket 2 CSocket和CAsyncSocket利用Windows的消息模式將前台的界面處理和後台的網路通信都整合到消息傳遞模型 下,但是很明顯,一旦後台的網路過於繁忙,則前台的處理可能就無法顧及,所以CSocket也就只能小打小鬧
建議你多看MSDN,上面說的清楚,和孫鑫的VC++視頻!!

熱點內容
c語言跳出死循環 發布:2025-05-15 20:06:04 瀏覽:823
a19處理器相當於安卓哪個水平 發布:2025-05-15 20:05:29 瀏覽:638
榮耀9i安卓強行關機按哪個鍵 發布:2025-05-15 20:00:32 瀏覽:750
密碼鎖寫什麼最好 發布:2025-05-15 19:05:31 瀏覽:782
5的源碼是 發布:2025-05-15 19:04:07 瀏覽:719
c語言創建的源文件 發布:2025-05-15 18:54:08 瀏覽:611
3個數字密碼鎖有多少種 發布:2025-05-15 18:49:48 瀏覽:684
壓縮包手機打開 發布:2025-05-15 18:37:34 瀏覽:217
安卓取消耳機模式怎麼取消 發布:2025-05-15 18:24:24 瀏覽:59
氣球怎麼解壓視頻 發布:2025-05-15 18:20:00 瀏覽:783