socket程式設計在windows上首先需要這個標頭檔案和「ws2_32.lib」這個lib庫檔案。
soket程式設計一般分為udp通訊與tcp通訊,那麼簡單的udp通訊與tcp通訊前面的過程基本都是一樣的,只有在收發資料的時候會有不同。
udp通訊的一般步驟:
(1)、初始化
wsadata wd;
wsastartup(0x0202,&wd); //初始化載入ws2_32.lib
wsastartup是socket程式設計的初始化工作
(2)、建立套接字
socket sock = socket(af_inet,sock_dgram,0);
if(sock == invalid_socket)
;
sin_family: 指定為af_inet,表示udp,tcp家族
sin_port: 指定埠
sin_addr: 指定ip
sin_zreo: 保證sockaddr_in與sockaddr有相同的大小,便於相互轉化
例項:
const int port = 8080;
sockaddr_in sa = ;
int n = bind(sock,(sockaddr*)&sa,sizeof(sa));
if(socket_error == n)
{ cout<<"bind繫結埠失敗! 錯誤碼:"《套接字繫結了8080埠,其中埠需要用htons反轉下,因為網路上的位元組序與計算機上的相反,如果是伺服器端繫結埠可以不設定ip,這樣伺服器可以接受本機上所有網段的訊息。
(4)、監聽
監聽只有是tcp伺服器端才會有的。
int listen(
socket s,
int backlog
)
s: 套接字
backlog: the maximum length of the queue of pending connections.
(5)、等待連線
只有tcp伺服器端才會有,伺服器端等待客戶端的socket連線
socket
accept(
socket s,
struct sockaddr* addr,
int* addrlen
);
接受成功,則返回乙個指向客戶段的套接字。
s: 伺服器端的套接字
addr: 用於儲存客戶端的資訊(包括:ip,埠等)
addrlen: addr結構體的大小
(6)、連線
只有客戶端才會有,向伺服器端傳送連線請求
int
connect(
socket s,
const struct sockaddr* name,
int namelen
s: 客戶端的套接字
name: 伺服器端位址資訊(需要制定ip,埠)
namelen: 結構體name的大小
連線成功,則返回非0,否則返回0
(7)、傳送資料
傳送資料分為udp傳送與tcp傳送,udp傳送使用sendto函式,tcp傳送使用send函式
int
sendto(
socket s,
const char far * buf,
int len,
int flags,
const struct sockaddr far * to,
int tolen
);
s: 傳送端的套接字
buf: 傳送資料的快取
len: 傳送資料的大小
flags: 設為0
to: 接收端的位址資訊(需要指定ip,埠)
tolen: 接受端結構體的大小
函式返回實際傳送資料的大小
int
send(
socket s,
const char far * buf,
int len,
int flags
);
引數: 與senfto類同
(8)、接受資料
接受資料有兩個函式,recv 與 recvfrom
int
recv(
socket s,
char far * buf,
int len,
int flags
);
s: 接收端(伺服器端)的套接字
buf: 接受快取
len: 快取大小
flags: 一般設為0
函式返回實際接受的大小,-1表示接受失敗
int
recvfrom(
socket s,
char far * buf,
int len,
int flags,
struct sockaddr far * from,
int far * fromlen
);
from: 傳送端的位址資訊
fromlen: from結構體的大小
(9)、getpeername 與 getsockname
getpeername可以獲取對方ip,埠資訊(只限tcp)
getsockname可以獲取本機ip,埠資訊
int
getpeername(
socket s,
struct sockaddr far * name,
int far * namelen
)
s: 傳送方的套接字
name: 儲存傳送方的位址資訊
namelen: name結構體的大小
int
getsockname(
socket s,
struct sockaddr far * name,
int far * namelen
);
s: 本機的套接字
其餘:類同
udp通訊--傳送端
// #include "stdafx.h"
#include #include using namespace std;
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _tchar* argv)
{ wsadata wd;
wsastartup(0x0202,&wd);
socket sock = socket(af_inet,sock_dgram,0);
if(sock == invalid_socket)
{ cout<<"sock 建立失敗!"<
udp通訊--接收端
// #include "stdafx.h"
#include "stdafx.h"
#include #include using namespace std;
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _tchar* argv)
{ wsadata wd;
wsastartup(0x0202,&wd);
socket sock = socket(af_inet,sock_dgram,0);
if(sock == invalid_socket)
{ cout<<"sock 建立失敗!"<0)
{ s[n] = 0;
cout<
tcp通訊--伺服器端
// #include "stdafx.h"
#include #include using namespace std;
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _tchar* argv)
{ wsadata wd;
wsastartup(0x0202,&wd);
socket sock = socket(af_inet,sock_stream,0);
if(sock == invalid_socket)
{ cout<<"sock 失敗!"<0 )
{ s[n] = 0;
cout<
tcp通訊--客戶端
// #include "stdafx.h"
#include #include using namespace std;
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _tchar* argv)
{ wsadata wd;
wsastartup(0x0202,&wd);
socket sock = socket(af_inet,sock_stream,0);
if(sock == invalid_socket)
{ cout<<"sock 失敗!"<
socket程式設計(1)
依據tcp協議,在c s架構的通訊過程中,客戶端和伺服器的socket動作如下 伺服器 1.在伺服器,用乙個埠來例項化乙個 serversocket物件。此時,伺服器就可以這個埠時刻監聽從客戶端發來的連線請求。2.呼叫serversocket的accept方法,開始監聽連線從埠上發來的連線請求。3....
socket程式設計總結 1
使用socket寫 主要是要看自己的需求是什麼。如果通訊時,內容很重要就要使tcp方式。如果使用者數太多,可能就要使用udp方式了。在tcp模式下,最簡單的方式就是這樣的,使阻塞方式 服務端 1.初始化socket環境,建立socket 2.梆定乙個埠 3.開始監聽 4.接收客戶端 5.接收到客戶端...
Socket程式設計原理 1
兩種套接字 流套接字 sock stream tcp ip協議 資料報套接字 sock dgram udp ip協議 什麼是tcp ip udp?tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,是乙個工業標準的協...