當前位置:首頁 » 編程軟體 » udp套接字編程

udp套接字編程

發布時間: 2022-11-18 19:21:38

1. TCP和UDP網路通訊的區別及實現方式

TCP:Transmission Control Protocol 傳輸控制協議TCP是一種面向連接(連接導向)的、可靠的、基於位元組流的運輸層(Transport layer)通信協議,在 OSI模型中,它完成第四層傳輸層所指定的功能。
UDP:是User Datagram Protocol的簡稱,用戶數據包協議,是 OSI 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
TCP和UDP傳輸就類似於我們的手機通電話和手機發簡訊,一種必需連通了,才能夠通話,相對來說比較可靠,傳輸速度比較快,另一種可以在關機狀態(無連接)發送信息,相對來說,可靠性比較差,傳輸速度較慢。具體的差別如下:
TCP協議面向連接,UDP協議面向非連接
TCP協議傳輸速度慢,UDP協議傳輸速度快
TCP協議保證數據順序,UDP協議不保證
TCP協議保證數據正確性,UDP協議可能丟包
TCP協議對系統資源要求多,UDP協議要求少
不管是基於TCP還是基於UDP的網路通訊編程,都要區分伺服器端和客戶端,下面以TCP為例,實現客戶端和伺服器端通訊的實現步驟:
TCP伺服器端的編寫步驟:
1. 首先,你需要創建一個用於通訊的套介面,一般使用socket調用來實現。這等於你有了一個用於通訊的電話:)
2. 然後,你需要給你的套介面設定埠,相當於,你有了電話號碼。這一步 一般通過設置網路套介面地址和調用bind函數來實現。
3. 調用listen函數使你的套介面成為一個監聽套接字。 以上三個步驟是TCP伺服器的常用步驟。
4. 調用accept函數來啟動你的套接字,這時你的程序就可以等待客戶端的連接了。
5. 處理客戶端的連接請求。
6. 終止連接。
TCP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置要連接的對方的IP地址和埠等屬性;
5、連接伺服器,用函數connect()(相當於撥號);
6、收發數據,用函數send()和recv(),或者read()和write()(相當於通話);

2. VC實現最簡單的UDP通信

用Winsock實現語音全雙工通信使用2009年01月05日 星期一 10:50[文章信息] 作者:張曉明 楊建華 錢名海時間:2003-06-28出處:PCVC責任編輯:方舟 [文章導讀] 在Windows 95環境下,基於TCP/IP協議,用Winsock完成了話音的一端—端傳輸

摘要:在Windows 95環境下,基於TCP/IP協議,用Winsock完成了話音的端到端傳輸。採用雙套接字技術,闡述了主要函數的使用要點,以及基於非同步選擇機制的應用方法。同時,給出了相應的實常式序。

一、引言

Windows 95作為微機的操作系統,已經完全融入了網路與通信功能,不僅可以建立純Windows 95環境下的「對等網路」,而且支持多種協議,如TCP/IP、IPX/SPX、NETBUI等。在TCP/IP協議組中,TPC是一種面向連接的協義,為用戶提供可靠的、全雙工的位元組流服務,具有確認、流控制、多路復用和同步等功能,適於數據傳輸。UDP協議則是無連接的,每個分組都攜帶完整的目的地址,各分組在系統中獨立傳送。它不能保證分組的先後順序,不進行分組出錯的恢復與重傳,因此不保證傳輸的可靠性,但是,它提供高傳輸效率的數據報服務,適於實時的語音、圖像傳輸、廣播消息等網路傳輸。

Winsock介面為進程間通信提供了一種新的手段,它不但能用於同一機器中的進程之間通信,而且支持網路通信功能。隨著Windows 95的推出。Winsock已經被正式集成到了Windows系統中,同時包括了16位和32位的編程介面。而Winsock的開發工具也可以在Borland C++4.0、Visual C++2.0這些C編譯器中找到,主要由一個名為winsock.h的頭文件和動態連接庫winsock.dll或wsodk32.dll組成,這兩種動態連接庫分別用於Win16和Win32的應用程序。

本文針對話音的全雙工傳輸要求,採用UDP協議實現了實時網路通信。使用VisualC++2.0編譯環境,其動態連接庫名為wsock32.dll。

二、主要函數的使用要點

通過建立雙套接字,可以很方便地實現全雙工網路通信。

1.套接字建立函數:

SOCKET socket(int family,int type,int protocol)
對於UDP協議,寫為:

SOCKRET s;
s=socket(AF_INET,SOCK_DGRAM,0);
或s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
為了建立兩個套接字,必須實現地址的重復綁定,即,當一個套接字已經綁定到某本地地址後,為了讓另一個套接字重復使用該地址,必須為調用bind()函數綁定第二個套接字之前,通過函數setsockopt()為該套接字設置SO_REUSEADDR套接字選項。通過函數getsockopt()可獲得套接字選項設置狀態。需要注意的是,兩個套接字所對應的埠號不能相同。 此外,還涉及到套接字緩沖區的設置問題,按規定,每個區的設置范圍是:不小於512個位元組,大大於8k位元組,根據需要,文中選用了4k位元組。

2.套接字綁定函數

int bind(SOCKET s,struct sockaddr_in*name,int namelen)
s是剛才創建好的套接字,name指向描述通訊對象的結構體的指針,namelen是該結構體的長度。該結構體中的分量包括:IP地址(對應name.sin_addr.s_addr)、埠號(name.sin_port)、地址類型(name.sin_family,一般都賦成AF_INET,表示是internet地址)。

(1)IP地址的填寫方法:在全雙工通信中,要把用戶名對應的點分表示法地址轉換成32位長整數格式的IP地址,使用inet_addr()函數。

(2)埠號是用於表示同一台計算機不同的進程(應用程序),其分配方法有兩種:1)進程可以讓系統為套接字自動分配一埠號,只要在調用bind前將埠號指定為0即可。由系統自動分配的埠號位於1024~5000之間,而1~1023之間的任一TCP或UDP埠都是保留的,系統不允許任一進程使用保留埠,除非其有效用戶ID是零(超級用戶)。

2)進程可為套接字指定一特定埠。這對於需要給套接字分配一眾所埠的伺服器是很有用的。指定范圍為1024和65536之間。可任意指定。

在本程序中,對兩個套接字的埠號規定為2000和2001,前者對應發送套接字,後者對應接收套接字。

埠號要從一個16位無符號數(u_short類型數)從主機位元組順序轉換成網路位元組順序,使用htons()函數。

根據以上兩個函數,可以給出雙套接字建立與綁定的程序片斷。

//設置有關的全局變數
SOCKET sr,ss;
HPSTR sockBufferS,sockBufferR;
HANDLE hSendData,hReceiveData;
DWROD dwDataSize=1024*4;
struct sockaddr_in therel.there2;
#DEFINE LOCAL_HOST_ADDR 200.200.200.201
#DEFINE REMOTE_HOST-ADDR 200.200.200.202
#DEFINE LOCAL_HOST_PORT 2000
#DEFINE LOCAL_HOST_PORT 2001
//套接字建立函數
BOOL make_skt(HWND hwnd)
{
struct sockaddr_in here,here1;
ss=socket(AF_INET,SOCK_DGRAM,0);
sr=socket(AF_INET,SOCK_DGRAM,0);
if((ss==INVALID_SOCKET)||(sr==INVALID_SOCKET))
{
MessageBox(hwnd,「套接字建立失敗!」,「」,MB_OK);
return(FALSE);
}
here.sin_family=AF_INET;
here.sin_addr.s_addr=inet_addr(LOCAL_HOST_ADDR);
here.sin_port=htons(LICAL_HOST_PORT);
//another socket
herel.sin_family=AF_INET;
herel.sin_addr.s_addr(LOCAL_HOST_ADDR);
herel.sin_port=htons(LOCAL_HOST_PORT1);
SocketBuffer();//套接字緩沖區的鎖定設置
setsockopt(ss,SOL_SOCKET,SO_SNDBUF,(char FAR*)sockBufferS,dwDataSize);
if(bind(ss,(LPSOCKADDR)&here,sizeof(here)))
{
MessageBox(hwnd,「發送套接字綁定失敗!」,「」,MB_OK);
return(FALSE);
}
setsockopt(sr SQL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*)
sockBufferR,dwDataSize);
if(bind(sr,(LPSOCKADDR)&here1,sizeof(here1)))
{
MessageBox(hwnd,「接收套接字綁定失敗!」,「」,MB_OK);
return(FALSE);
}
return(TRUE);
}
//套接字緩沖區設置
void sockBuffer(void)
{
hSendData=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hSendData)
{
MessageBox(hwnd,「發送套接字緩沖區定位失敗!」,NULL,
MB_OK|MB_ICONEXCLAMATION);
return;
}
if((sockBufferS=GlobalLock(hSendData)==NULL)
{
MessageBox(hwnd,「發送套接字緩沖區鎖定失敗!」,NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0];
return;
}
hReceiveData=globalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hReceiveData)
{
MessageBox(hwnd,"「接收套接字緩沖區定位敗!」,NULL
MB_OK|MB_ICONEXCLAMATION);
return;
}
if((sockBufferT=Globallock(hReceiveData))=NULL)
MessageBox(hwnd,"發送套接字緩沖區鎖定失敗!」,NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0]);
return;
}
{
3.數據發送與接收函數;

int sendto(SOCKET s.char*buf,int len,int flags,struct sockaddr_in to,int
tolen);
int recvfrom(SOCKET s.char*buf,int len,int flags,struct sockaddr_in
fron,int*fromlen)
其中,參數flags一般取0。

recvfrom()函數實際上是讀取sendto()函數發過來的一個數據包,當讀到的數據位元組少於規定接收的數目時,就把數據全部接收,並返回實際接收到的位元組數;當讀到的數據多於規定值時,在數據報文方式下,多餘的數據將被丟棄。而在流方式下,剩餘的數據由下recvfrom()讀出。為了發送和接收數據,必須建立數據發送緩沖區和數據接收緩沖區。規定:IP層的一個數據報最大不超過64K(含數據報頭)。當緩沖區設置得過多、過大時,常因內存不夠而導致套接字建立失敗。在減小緩沖區後,該錯誤消失。經過實驗,文中選用了4K位元組。

此外,還應注意這兩個函數中最後參數的寫法,給sendto()的最後參數是一個整數值,而recvfrom()的則是指向一整數值的指針。

4.套接字關閉函數:closesocket(SOCKET s)

通訊結束時,應關閉指定的套接字,以釋與之相關的資源。

在關閉套接字時,應先對鎖定的各種緩沖區加以釋放。其程序片斷為:

void CloseSocket(void)
{
GlobalUnlock(hSendData);
GlobalFree(hSenddata);
GlobalUnlock(hReceiveData);
GlobalFree(hReceiveDava);
if(WSAAysncSelect(ss,hwnd,0,0)=SOCKET_ERROR)
{
MessageBos(hwnd,「發送套接字關閉失敗!」,「」,MB_OK);
return;
}
if(WSAAysncSelect(sr,hwnd,0,0)==SOCKET_ERROR)
{
MessageBox(hwnd,「接收套接字關閉失敗!」,「」,MB_OK);
return;
}
WSACleanup();
closesockent(ss);
closesockent(sr);
return;
}
三、Winsock的編程特點與非同步選擇機制

1 阻塞及其處理方式

在網路通訊中,由於網路擁擠或一次發送的數據量過大等原因,經常會發生交換的數據在短時間內不能傳送完,收發數據的函數因此不能返回,這種現象叫做阻塞。Winsock對有可能阻塞的函數提供了兩種處理方式:阻塞和非阻塞方式。在阻塞方式下,收發數據的函數在被調用後一直要到傳送完畢或者出錯才能返回。在阻塞期間,被阻的函數不會斷調用系統函數GetMessage()來保持消息循環的正常進行。對於非阻塞方式,函數被調用後立即返回,當傳送完成後由Winsock給程序發一個事先約定好的消息。

在編程時,應盡量使用非阻塞方式。因為在阻塞方式下,用戶可能會長時間的等待過程中試圖關閉程序,因為消息循環還在起作用,所以程序的窗口可能被關閉,這樣當函數從Winsock的動態連接庫中返回時,主程序已經從內存中刪除,這顯然是極其危險的。

2 非同步選擇函數WSAAsyncSelect()的使用

Winsock通過WSAAsyncSelect()自動地設置套接字處於非阻塞方式。使用WindowsSockets實現Windows網路程序設計的關鍵就是它提供了對網路事件基於消息的非同步存取,用於注冊應用程序感興趣的網路事件。它請求Windows Sockets DLL在檢測到套接字上發生的網路事件時,向窗口發送一個消息。對UDP協議,這些網路事件主要為:

FD_READ 期望在套接字收到數據(即讀准備好)時接收通知;

FD_WRITE 期望在套接字可發送數(即寫准備好)時接收通知;

FD_CLOSE 期望在套接字關閉時接電通知

消息變數wParam指示發生網路事件的套接字,變數1Param的低位元組描述發生的網路事件,高字包含錯誤碼。如在窗口函數的消息循環中均加一個分支:

int ok=sizeof(SOCKADDR);
case wMsg;
switch(1Param)
{
case FD_READ:
//套接字上讀數據
if(recvfrom(sr.lpPlayData[j],dwDataSize,0,(struct sockaddr FAR*)&there1,

(int FAR*)&ok)==SOCKET_ERROR0
{
MessageBox)hwnd,「數據接收失敗!」,「」,MB_OK);
return(FALSE);
}
case FD_WRITE:
//套接字上寫數據
}
break;
在程序的編制中,應根據需要靈活地將WSAAsyncSelect()函靈敏放在相應的消息循環之中,其它說明可參見文獻[1]。此外,應該指出的是,以上程序片斷中的消息框主要是為程序調試方便而設置的,而在正式產品中不再出現。同時,按照程序容錯誤設計,應建立一個專門的容錯處理函數。程序中可能出現的各種錯誤都將由該函數進行處理,依據錯誤的危害程度不同,建立幾種不同的處理措施。這樣,才能保證雙方通話的順利和可靠。

四、結論

本文是多媒體網路傳輸項目的重要內容之一,目前,結合硬體全雙工語音卡等設備,已經成功地實現了話音的全雙工的通信。有關整個多媒體傳輸系統設計的內容,將有另文敘述。

3. 簡述基於TCP和UDP的Socket編程的異同

Socket有兩種主要的操作方式:面向連接的和無連接的。無連接的操作使用UDP數據報協議,這個操作不需要連接一個目的的socket,它只是簡單地投出數據報,快速高效,但缺少數據安全性。面向連接的操作使用TCP協議,一個這個模式的socket必須在發送數據之前與目的地的socket取得一個連接,一旦連接建立了,socket就可以使用一個流介面:打開-讀-寫-關閉,所有的發送的信息都會在另一端以同樣的順序被接收,面向連接的操作比無連接的操作效率要低,但數據的安全性更高。基於TCP的socket編程是採用的流式套接字(SOCK_STREAM)。基於UDP採用的數據報套接字(SOCK_DGRAM).
流式套接字的設計是針對面向連接的網路應用,在數據傳輸之前需要預先建立連接,在數據傳輸過程中需要維持連接,在數據傳輸結束後需要釋放連接。由於採用校驗和、確認與超時等差錯控制手段,因此流式套接字可以保證數據傳輸的正確性。
數據報套接字(SOCK_DGRAM)提供無連接的、不可靠的數據傳輸服務,實際上它是基於TCP/IP協議族中的UDP協議實現的。數據報套接字提供無序、有差錯與有重復的數據流服務。數據報套接字的設計是針對無連接的網路應用,在數據傳輸之前不需要預先建立連接。由於只採用很有限的差錯控制手段,因此數據報套接字無法保證數據傳輸的正確性。

4. 什麼是udp套接字

UDP套接字
UDP協議提供了一種不同於TCP協議的端到端服務。實際上UDP協議只實現兩個功能:
1)在IP協議的基礎上添加了另一層地址(埠)
2)對數據傳輸過程中可能產生的數據錯誤進行了檢測,並拋棄已經損壞的數據。
由於其簡單性,UDP套接字具有一些與我們之前所看到的TCP套接字不同的特徵。
例如,UDP套接字在使用前不需要進行連接。TCP協議與電話通信相似,而UDP協議則與郵件通信相似:你寄包裹或信件時不需要進行"連接",但是你得為每個包裹和信件指定目的地址。類似的,每條信息(即數據報文,datagram)負載了自己的地址信息,並與其他信息相互獨立。在接收信息時,UDP套接字扮演的角色就像是一個信箱,從不同地址發送來的信件和包裹都可以放到裡面。一旦被創建,UDP套接字就可以用來連續地向不同的地址發送信息,或從任何地址接收信息。
UDP套接字與TCP套接字的另一個不同點在於他們對信息邊界的處理方式不同:UDP套接字將保留邊界信息。這個特性使應用程序在接受信息時,從某些方面來說比使用TCP套接字更簡單。
最後一個不同點是,UDP協議所提供的端到端傳輸服務是盡力而為(best-effort)的,即UDP套接字將盡可能地傳送信息,但並不保證信息一定能成功到達目的地址,而且信息到達的順序與其發送順序不一定一致(就像通過郵政部門寄信一樣)。因此,使用了UDP套接字的程序必須准備好處理信息的丟失和重排。(稍後我們將給出一個這樣的例子)
既然UDP協議為程序帶來了這個額外的負擔,為什麼還會使用它而不使用TCP協議呢?
原因之一是效率:如果應用程序只交換非常少量的數據,例如從客戶端到伺服器端的簡單請求消息,或一個反方向的響應消息,TCP連接的建立階段就至少要傳輸其兩倍的信息量(還有兩倍的往返延遲時間)。
另一個原因是靈活性:如果除可靠的位元組流服務外,還有其他的需求,UDP協議則提供了一個最小開銷的平台來滿足任何需求的實現。

5. 關於c#中UDP編程

//這是一個源碼你看看
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace UDPClient
{
public partial class frmUdp : Form
{
private UdpClient sendUdpClient;
private UdpClient receiveUpdClient;
public frmUdp()
{
InitializeComponent();
IPAddress[] ips = Dns.GetHostAddresses("");
tbxlocalip.Text = ips[3].ToString();
int port = 51883;
tbxlocalPort.Text = port.ToString();
tbxSendtoIp.Text = ips[3].ToString();
tbxSendtoport.Text = port.ToString();
}

// 接受消息
private void btnReceive_Click(object sender, EventArgs e)
{
// 創建接收套接字
IPAddress localIp = IPAddress.Parse(tbxlocalip.Text);
IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalPort.Text));
receiveUpdClient = new UdpClient(localIpEndPoint);

Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.Start();
}

// 接收消息方法
private void ReceiveMessage()
{
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
try
{
// 關閉receiveUdpClient時此時會產生異常
byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint);

string message = Encoding.Unicode.GetString(receiveBytes);

// 顯示消息內容
ShowMessageforView(lstbxMessageView, string.Format("{0}[{1}]", remoteIpEndPoint, message));
}
catch
{
break;
}
}
}

// 利用委託回調機制實現界面上消息內容顯示
delegate void ShowMessageforViewCallBack(ListBox listbox, string text);
private void ShowMessageforView(ListBox listbox, string text)
{
if (listbox.InvokeRequired)
{
ShowMessageforViewCallBack showMessageforViewCallback = ShowMessageforView;
listbox.Invoke(showMessageforViewCallback, new object[] { listbox, text });
}
else
{
lstbxMessageView.Items.Add(text);
lstbxMessageView.SelectedIndex = lstbxMessageView.Items.Count - 1;
lstbxMessageView.ClearSelected();
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (tbxMessageSend.Text == string.Empty)
{
MessageBox.Show("發送內容不能為空","提示");
return;
}

// 選擇發送模式
if (chkbxAnonymous.Checked == true)
{
// 匿名模式(套接字綁定的埠由系統隨機分配)
sendUdpClient = new UdpClient(0);
}
else
{
// 實名模式(套接字綁定到本地指定的埠)
IPAddress localIp = IPAddress.Parse(tbxlocalip.Text);
IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalPort.Text));
sendUdpClient = new UdpClient(localIpEndPoint);
}

Thread sendThread = new Thread(SendMessage);
sendThread.Start(tbxMessageSend.Text);
}

// 發送消息方法
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] sendbytes = Encoding.Unicode.GetBytes(message);
IPAddress remoteIp = IPAddress.Parse(tbxSendtoIp.Text);
IPEndPoint remoteIpEndPoint = new IPEndPoint(remoteIp, int.Parse(tbxSendtoport.Text));
sendUdpClient.Send(sendbytes, sendbytes.Length, remoteIpEndPoint);

sendUdpClient.Close();

// 清空發送消息框
ResetMessageText(tbxMessageSend);
}

// 採用了回調機制
// 使用委託實現跨線程界面的操作方式
delegate void ResetMessageCallback(TextBox textbox);
private void ResetMessageText(TextBox textbox)
{
// Control.InvokeRequired屬性代表
// 如果控制項的處理與調用線程在不同線程上創建的,則為true,否則為false
if (textbox.InvokeRequired)
{
ResetMessageCallback resetMessagecallback = ResetMessageText;
textbox.Invoke(resetMessagecallback, new object[] { textbox });
}
else
{
textbox.Clear();
textbox.Focus();
}
}

// 停止接收
private void btnStop_Click(object sender, EventArgs e)
{
receiveUpdClient.Close();
}

// 清空接受消息框
private void btnClear_Click(object sender, EventArgs e)
{
this.lstbxMessageView.Items.Clear();
}
}
}

6. 有沒有windows下c語言實現udp協議的代碼

php">Windows下C語言的Socket編程例子(TCP和UDP)
一。<TCP>
server端:
復制代碼
1#include"stdafx.h"
2#include<stdio.h>
3#include<winsock2.h>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7intmain(intargc,char*argv[])
8{
9//初始化WSA
10WORDsockVersion=MAKEWORD(2,2);
11WSADATAwsaData;
12if(WSAStartup(sockVersion,&wsaData)!=0)
13{
14return0;
15}
16
17//創建套接字
18SOCKETslisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
19if(slisten==INVALID_SOCKET)
20{
21printf("socketerror!");
22return0;
23}
24
25//綁定IP和埠
26sockaddr_insin;
27sin.sin_family=AF_INET;
28sin.sin_port=htons(8888);
29sin.sin_addr.S_un.S_addr=INADDR_ANY;
30if(bind(slisten,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
31{
32printf("binderror!");
33}
34
35//開始監聽
36if(listen(slisten,5)==SOCKET_ERROR)
37{
38printf("listenerror!");
39return0;
40}
41
42//循環接收數據
43SOCKETsClient;
44sockaddr_inremoteAddr;
45intnAddrlen=sizeof(remoteAddr);
46charrevData[255];
47while(true)
48{
49printf("等待連接... ");
50sClient=accept(slisten,(SOCKADDR*)&remoteAddr,&nAddrlen);
51if(sClient==INVALID_SOCKET)
52{
53printf("accepterror!");
54continue;
55}
56printf("接受到一個連接:%s ",inet_ntoa(remoteAddr.sin_addr));
57
58//接收數據
59intret=recv(sClient,revData,255,0);
60if(ret>0)
61{
62revData[ret]=0x00;
63printf(revData);
64}
65
66//發送數據
67char*sendData="你好,TCP客戶端! ";
68send(sClient,sendData,strlen(sendData),0);
69closesocket(sClient);
70}
71
72closesocket(slisten);
73WSACleanup();
74return0;
75}
復制代碼
client端:
復制代碼
1#include"stdafx.h"
2#include<WINSOCK2.H>
3#include<STDIO.H>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7
8intmain(intargc,char*argv[])
9{
10WORDsockVersion=MAKEWORD(2,2);
11WSADATAdata;
12if(WSAStartup(sockVersion,&data)!=0)
13{
14return0;
15}
16
17SOCKETsclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
18if(sclient==INVALID_SOCKET)
19{
20printf("invalidsocket!");
21return0;
22}
23
24sockaddr_inserAddr;
25serAddr.sin_family=AF_INET;
26serAddr.sin_port=htons(8888);
27serAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
28if(connect(sclient,(sockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
29{
30printf("connecterror!");
31closesocket(sclient);
32return0;
33}
34char*sendData="你好,TCP服務端,我是客戶端! ";
35send(sclient,sendData,strlen(sendData),0);
36
37charrecData[255];
38intret=recv(sclient,recData,255,0);
39if(ret>0)
40{
41recData[ret]=0x00;
42printf(recData);
43}
44closesocket(sclient);
45WSACleanup();
46return0;
47}
復制代碼

二.<UDP>
SERVER端
復制代碼
1#include"stdafx.h"
2#include<stdio.h>
3#include<winsock2.h>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7intmain(intargc,char*argv[])
8{
9WSADATAwsaData;
10WORDsockVersion=MAKEWORD(2,2);
11if(WSAStartup(sockVersion,&wsaData)!=0)
12{
13return0;
14}
15
16SOCKETserSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
17if(serSocket==INVALID_SOCKET)
18{
19printf("socketerror!");
20return0;
21}
22
23sockaddr_inserAddr;
24serAddr.sin_family=AF_INET;
25serAddr.sin_port=htons(8888);
26serAddr.sin_addr.S_un.S_addr=INADDR_ANY;
27if(bind(serSocket,(sockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
28{
29printf("binderror!");
30closesocket(serSocket);
31return0;
32}
33
34sockaddr_inremoteAddr;
35intnAddrLen=sizeof(remoteAddr);
36while(true)
37{
38charrecvData[255];
39intret=recvfrom(serSocket,recvData,255,0,(sockaddr*)&remoteAddr,&nAddrLen);
40if(ret>0)
41{
42recvData[ret]=0x00;
43printf("接受到一個連接:%s ",inet_ntoa(remoteAddr.sin_addr));
44printf(recvData);
45}
46
47char*sendData="一個來自服務端的UDP數據包 ";
48sendto(serSocket,sendData,strlen(sendData),0,(sockaddr*)&remoteAddr,nAddrLen);
49
50}
51closesocket(serSocket);
52WSACleanup();
53return0;
54}
復制代碼
CLIENT端
復制代碼
1#include"stdafx.h"
2#include<stdio.h>
3#include<winsock2.h>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7intmain(intargc,char*argv[])
8{
9WORDsocketVersion=MAKEWORD(2,2);
10WSADATAwsaData;
11if(WSAStartup(socketVersion,&wsaData)!=0)
12{
13return0;
14}
15SOCKETsclient=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
16
17sockaddr_insin;
18sin.sin_family=AF_INET;
19sin.sin_port=htons(8888);
20sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
21intlen=sizeof(sin);
22
23char*sendData="來自客戶端的數據包. ";
24sendto(sclient,sendData,strlen(sendData),0,(sockaddr*)&sin,len);
25
26charrecvData[255];
27intret=recvfrom(sclient,recvData,255,0,(sockaddr*)&sin,&len);
28if(ret>0)
29{
30recvData[ret]=0x00;
31printf(recvData);
32}
33
34closesocket(sclient);
35WSACleanup();
36return0;
37}

7. UDP套接字編程中,怎麼區分不同的客戶端,想給不同的客戶端發送不同的消息

你在客戶端傳過來的socket中帶上點客戶特有的信息用特殊符號分隔開,
服務端拿到數據後把那段信息切出來,判斷下是哪個客戶就好了。

8. 套接字是什麼

套接字(socket)是一個抽象層,應用程序可以通過它發送或接收數據,可對其進行像對文件一樣的打開、讀寫和關閉等操作。套接字允許應用程序將I/O插入到網路中,並與網路中的其他應用程序進行通信。網路套接字是IP地址與埠的組合。

總之,套接字Socket=(IP地址:埠號),套接字的表示方法是點分十進制的IP地址後面寫上埠號,中間用冒號或逗號隔開。每一個傳輸層連接唯一地被通信兩端的兩個端點(即兩個套接字)所確定。

(8)udp套接字編程擴展閱讀

Socket最初是加利福尼亞大學Berkeley分校為Unix系統開發的網路通信介面。後來隨著TCP/IP網路的發展,Socket成為最為通用的應用程序介面,也是在Internet上進行應用開發最為通用的API。

Windows系統流行起來之後,由Microsoft聯合了其他幾家公司在Berkeley Sockets的基礎之上進行了擴充,共同制定了一套Windows下的網路編程介面,即Windows Sockets規范。

Windows Sockets規范是一套開放的、支持多種協議的Windows下的網路編程介面,包括1.1版和2.0版兩個版本。

參考資料來源:網路-套接字

9. linux下udp編程如何同時獲取源IP和埠及目的IP和埠

http://www.cnblogs.com/kissazi2/p/3158603.html

10. Python 之 Socket編程(TCP/UDP)

socket(family,type[,protocal]) 使用給定的地址族、套接字類型、協議編號(默認為0)來創建套接字。

有效的埠號: 0~ 65535
但是小於1024的埠號基本上都預留給了操作系統
POSIX兼容系統(如Linux、Mac OS X等),在/etc/services文件中找到這些預留埠與的列表

面向連接的通信提供序列化、可靠的和不重復的數據交付,而沒有記錄邊界。意味著每條消息都可以拆分多個片段,並且每個消息片段都能到達目的地,然後將它們按順序組合在一起,最後將完整的信息傳遞給等待的應用程序。
實現方式(TCP):
傳輸控制協議(TCP), 創建TCP必須使用SOCK_STREAM作為套接字類型
因為這些套接字(AF_INET)的網路版本使用網際網路協議(IP)來搜尋網路中的IP,
所以整個系統通常結合這兩種協議(TCP/IP)來進行網路間數據通信。

數據報類型的套接字, 即在通信開始之前並不需要建議連接,當然也無法保證它的順序性、可靠性或重復性
實現方式(UDP)
用戶數據包協議(UDP), 創建UDP必須使用SOCK_DGRAM (datagram)作為套接字類型
它也使用網際網路來尋找網路中主機,所以是UDP和IP的組合名字UDP/IP

注意點:
1)TCP發送數據時,已建立好TCP連接,所以不需要指定地址。UDP是面向無連接的,每次發送要指定是發給誰。
2)服務端與客戶端不能直接發送列表,元組,字典。需要字元串化repr(data)。

TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。

TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬體資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。

什麼時候應該使用TCP : 當對網路通訊質量有要求的時候,比如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸.

UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊……

UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網路質量不好,就會很容易丟包。

什麼時候應該使用UDP: 當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP ……

熱點內容
appleid為什麼連接伺服器出現問題 發布:2025-05-13 18:17:37 瀏覽:971
書翁怎麼配置 發布:2025-05-13 18:17:36 瀏覽:911
雲資料庫mongodb 發布:2025-05-13 18:16:12 瀏覽:774
A7編程 發布:2025-05-13 18:15:26 瀏覽:742
python視圖 發布:2025-05-13 18:14:01 瀏覽:759
win為什麼干不過安卓 發布:2025-05-13 18:12:27 瀏覽:586
文件夾只讀win8 發布:2025-05-13 18:11:41 瀏覽:272
xp安裝php 發布:2025-05-13 18:04:30 瀏覽:183
sqlserver介紹 發布:2025-05-13 17:58:00 瀏覽:4
雲閃付安卓版哪個版本好用 發布:2025-05-13 17:57:16 瀏覽:187