Socket程式設計(1)

2021-07-04 22:26:56 字數 4608 閱讀 7253

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 即傳輸控制協議 網間協議,是乙個工業標準的協...