C語言SOCKET學習

2021-07-09 02:09:46 字數 2756 閱讀 5537

常見的兩種套接字型別

sock_stream    tcp    流格式套接字

sock_dgram     udp    資料報套接字

基礎知識:

struct sockaddr // 基本不用

; // af_inet是 ipv4 網路協議的套接字型別,af_inet6 則是 ipv6 的;而 af_unix 則是 unix 系統本地通訊。

struct sockaddr_in // 大小一樣,可以用sockaddr *引用 sockaddr_in

; struct in_addr

;

傳輸時要考慮位元組序的問題,hbo (host byte order) 和cpu有關。nbo(network byte order) 是big-endian的寫法。

例子:如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為

addr big-endian little-endian // 以每個位元組為單位

0x0000 0x12 0xcd

0x0001 0x23 0xab

0x0002 0xab 0x34

0x0003 0xcd 0x12

下圖為socket流程圖,挺好的。

實際建立socket

struct sockarrd_in server_addr; // 目的地的資訊

memset(server_addr , 0 , sizeof(server_addr)); // 清空

server_addr.sin_family = af_inet;

server_addr.sin_port = htons(port );

/**htons()--"host to network short"

htonl()--"host to network long"

ntohs()--"network to host short"

ntohl()--"network to host long"

**/server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // inet_addr( ); 直接返回ip位址的網路位元組格式,錯誤時返回-1

// printf("%s",inet_ntoa(ina.sin_addr)); 相反的呼叫,返回字串形式的ip位址,重複呼叫覆蓋上次結果。

int socket_id = socket(af_inet, sock_steam , 0); //socket 描述符型別為 int

/**

如果你要固定用某個埠,就用bind繫結,一般server端使用。

bind()的用法:

一旦擁有套接字,就可以把套接字和機器上的某個埠繫結起來。

bind就是這個作用。

struct sockaddr_in my_addr;

bind(socket_id,(struct sockaddr *)my_addr,sizeof(struct sockaddr));

// 其中my_addr是sockaddr_in 型別,裡面的ip位址為本機位址,埠號為要繫結的埠號。

**/建立連線

int err = connect(socket_id, ( struct sockaddr *)server_addr, sizeof(server_addr)); // connect();錯誤返回-1

傳送資料

int send(int sock_id, char *str, int len, int flags);   // 返回實際傳送的位元組數,出錯返回-1

sock_id 是你想傳送資料的套接字描述符(或者是呼叫 socket() 或者是accept() 返回的 )

str 是指向你想傳送的資料的指標。len 是資料的長度,一般為strlen(str)。 把 flags 設定為 0 就可以了。

接受資料

int recv(int sock_id, char *buf, int len, unsigned int flags); // recv() 返回實際讀入緩衝的資料的位元組數。或者在錯誤的時候返回-1

sock_id 是要讀的套接字描述符。buf 是要讀的資訊的緩衝。len 是buf的最大長度。flags 可以設定為0。

關閉套接字

close(sock_id);//任何在另一端讀寫套接字的企 圖都將返回錯誤資訊。

/**int shutdown(int sock_id, int how);

sock_id 是你想要關閉的套接字檔案描述復。how 的值是下面的其中之 一:

0 - 不允許接受

1 - 不允許傳送

2 - 不允許傳送和接受(和close() 一樣)

shutdown() 成功時返回 0,失敗時返回 -1

**/server 端:

int listen(int sock_id, int backlog); //一般先bind繫結埠,再listen。

// sock_id 是被監聽的套接字檔案描述符。backlog 是在進入 佇列中允許的連線數目。在發生錯誤的時候返回-1.

/******下面是accept(); 的使用

#include #include #include main()  

C語言socket入門

socket協議 三次握手與結束連線 客戶端 include include include for bzero include for socketaddr in include include include define port 5050 埠號 define maxlen for data ...

C語言 socket 通訊程式設計

server端在tcp的通訊中,需要做到以下6點 socket套接字的構造 socket int socket int domain,int type,int protocol domain 指定通訊域 選擇通訊的協議族。type 型別,tcp為sock stream,udp為sock dgram。...

C 學習筆記之Socket

1 客戶端 視窗 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using syst...