5.1udp例項
udp傳送程式的步驟如下:
1. 用wsastartup函式初始化socket環境;
2. 用socket函式建立乙個套接字;
3. 用setsockopt函式設定套接字的屬性,例如設定為廣播型別;很多時候該步驟可以省略;
4. 建立乙個sockaddr_in,並指定其ip位址和埠號;
5. 用sendto函式向指定位址傳送資料,這裡的目標位址就是廣播位址;注意這裡不需要繫結,即使繫結了,其位址也會被sendto中的引數覆蓋;若使用send函式則會出錯,因為send是面向連線的,而udp是非連線的,只能使用sendto傳送資料;
6. 用closesocket函式關閉套接字;
7. 用wsacleanup函式關閉socket環境。
udp接收程式的步驟如下(注意接收方一定要bind套接字):
1. 用wsastartup函式初始化socket環境;
2. 用socket函式建立乙個套接字;
3. 用setsockopt函式設定套接字的屬性,例如設定為廣播型別;
4. 建立乙個sockaddr_in,並指定其ip位址和埠號;
5. 用bind函式將套接字與接收的位址繫結起來,然後呼叫recvfrom函式或者recv接收資料;注意這裡一定要繫結,因為接收報文的套接字必須在網路上有乙個繫結的名稱才能保證正確接收資料;
6. 用closesocket函式關閉套接字;
7. 用wsacleanup函式關閉socket環境。
傳送端程式:
#include
#include
void main()
//檢查socket庫的版本是否為2.0
if (lobyte( wsadata.wversion ) != 2 || hibyte( wsadata.wversion ) != 0 )
//2.建立socket,
sock = socket(
af_inet, //internetwork: udp, tcp, etc
sock_dgram, //sock_dgram說明是udp型別
0 //protocol
);if (invalid_socket == sock )
//3.設定該套接字為廣播型別,
bool opt = true;
setsockopt(sock, sol_socket, so_broadcast, reinterpret_cast(&opt), sizeof(opt));
//4.設定發往的位址
sockaddr_in addrto; //發往的位址
memset(&addrto,0,sizeof(addrto));
addrto.sin_family = af_inet; //位址型別為internetwork
addrto.sin_addr.s_addr = inaddr_broadcast; //設定ip為廣播位址
addrto.sin_port = htons(7861); //埠號為7861
int nlen=sizeof(addrto);
unsigned int uindex = 1;
while(true)
if ( lobyte( wsadata.wversion ) != 2 || hibyte( wsadata.wversion ) != 0 )
//2.建立套接字
sock = socket(af_inet,sock_dgram,0);
if (invalid_socket == sock)
//3.設定該套接字為廣播型別,
bool opt=true;
setsockopt(sock,sol_socket, so_broadcast,(char far *)&opt,sizeof(opt));
//4.建立位址
sockaddr_in from;
memset(&from,0,sizeof(from));
from.sin_family=af_inet;
//如果繫結位址不是本機位址或者addr_any,則recvfrom函式不會正確接收,而是立刻返回
// from.sin_addr.s_addr = addr_any;
from.sin_addr.s_addr = inet_addr("192.168.0.7");
//埠號必須和客戶發往的埠號一致
from.sin_port=htons(7861);
//5.繫結接收位址
bind(sock,(sockaddr*)&from,sizeof(from));
memset(&from,0,sizeof(from));
int fromlength = sizeof(sockaddr);
char buf[256];
memset(buf,0,sizeof(buf));
long number = 0;
while(true)
if ( lobyte( wsadata.wversion ) != 2 || hibyte( wsadata.wversion ) != 0 )
//2.建立socket,
sock = socket(
af_inet, //internetwork: udp, tcp, etc
sock_stream, //sock_stream說明是tcp socket
0 //protocol
);if (sock == invalid_socket )
//3.bind套接字,相當於給本地套接字賦值
sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family=af_inet;
myaddr.sin_addr.s_addr = inet_addr("192.168.0.7");
myaddr.sin_port=htons(7861);
bind(sock,(sockaddr*)&myaddr,sizeof(myaddr));
//4.設定發往的位址
sockaddr_in addrto; //發往的位址
memset(&addrto,0,sizeof(addrto));
addrto.sin_family=af_inet;
addrto.sin_addr.s_addr=inet_addr("192.168.0.9");
//埠號必須和伺服器繫結的埠號一致
addrto.sin_port=htons(7861);
//5.listen 另一端的socket
if (listen(sock,5) == socket_error )
else
if ( lobyte( wsadata.wversion ) != 2 || hibyte( wsadata.wversion ) != 0 )
//2.建立套接字
sock = socket(af_inet,sock_stream,0);
if (sock == invalid_socket )
//3.定義位址
sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family=af_inet;
myaddr.sin_addr.s_addr = inet_addr("192.168.0.9");
//埠號必須和客戶發往的埠號一致
myaddr.sin_port=htons(7861);
//4.connect
if (connect(sock,(sockaddr*)&myaddr,sizeof(myaddr)) == socket_error)
if (!wsacleanup())
}
Go基礎知識 TCP UDP
1.網路程式設計 物理層 資料鏈路層 網路層 傳輸層 應用層 2.socket是應用層與tcp ip協議族通訊的中間軟體抽象層 3.tcp程式設計 net包裡面,並且粘包的問題需要注意 服務端處理流程 1.監聽埠2.接收客戶端請求建立鏈結 3.建立goroutine處理鏈結 客戶端處理流程 1.建立...
TCP UDP程式設計
linux tcp udp程式設計 tcp程式設計伺服器端一般步驟 1 建立乙個socket,用函式socket 2 設定socket屬性,用函式setsockopt 可選 3 繫結ip位址 埠等資訊到socket上,用函式bind 4 開啟監聽,用函式listen 5 接收客戶端上來的連線,用函式...
TCP UDP程式設計
tcp程式設計的伺服器端一般步驟是 1 建立乙個socket,用函式socket 2 設定socket屬性,用函式setsockopt 可選 3 繫結ip位址 埠等資訊到socket上,用函式bind 4 開啟監聽,用函式listen 5 接收客戶端上來的連線,用函式accept 6 收發資料,用函...