Socket網絡編程
網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。Socket又稱"套接字",應用程式通常通過"套接字"向網絡發出請求或者應答網絡請求。
基於socket的一對一通信模型
1、服務端:
1)創建socket,使用socket函數;
2)準備通信地址,使用結構體類型;
3)綁定socket和通信地址,使用bind函數;
4)進行通信,使用read/write函數;
5)關閉socket,使用close函數;
2、客戶端:
1)創建socket,使用socket函數;
2)準備通信地址,使用伺服器的地址;
3)連接socket和通信地址,使用connect函數;
4)進行通信,使用read/write函數;
5)關閉socket,使用close函數;
Socket通信相關函數
1、socket函數:創建用於通信的交流點
函數原型:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
參數解析:
1)域/協議族,決定了本地通信還是網絡通信:
AF_UNIX/AF_LOCAL:表示實現同一個主機的本地通信;
AF_INET:表示基於ipv4的網絡通信;
AF_INET6:表示基於ipv6的網絡通信;
2)通信的方式,決定了選擇何種通信協議:
SOCK_STREAM:提供有序的、可靠的、雙向的以及面向連
接的字節流通信方式,也就是基於tcp協議的通信方式;
SOCK_DGRAM:提供不可靠的,非面向連接的數據報通信
方式,也就是基於udp協議的通信方式;
3)用於指定特殊的協議,默認給0即可;
返回值:成功返回用於交流的描述符,失敗返回-1。
功能:主要用於創建用於通信的交流點。
通信地址的數據類型分文如下三種:
1)通用的通信地址類型:該數據類型專門用於函數的形參類型,很少作為定義變量使用。
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
};
2)本地通信的通信地址類型:專門用於本地通信的通信地址類型。
#include <sys/un.h>
struct sockaddr_un
{
sa_family_t sun_family;//地址族
char sun_path[];//socket文件的路徑名
};
3)網絡通信的通信地址類型:該數據類型專門用於網絡通信。
#include <netinet/in.h>
struct sockaddr_in
{
sa_family_t sin_family;//地址族AF_INET.
in_port_t sin_port;//埠號 從1025開始使用
struct in_addr sin_addr;//IP位址
};
struct in_addr
{
in_addr_t s_addr; //整數類型的IP位址
};
2、bind函數:用於綁定socket和通信地址
函數原型:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
參數解析:
1)socket的描述符,socket函數的返回值;
2)結構體指針,需要做類型轉換;
3)通信地址的大小,使用sizeof計算即可;
返回值:如無錯誤發生,則bind()返回0。否則的話,將返回-1;
功能:主要用於綁定socket和通信地址。
3、connect函數:用於連接socket和通信地址
函數原型:
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
參數解析:同bind函數
返回值:如無錯誤發生,則bind()返回0。否則的話,將返回-1;
功能:用於連接socket和通信地址,參數和返回值參考bind函數即可。
字節序及IP位址轉換相關函數
1、字節序轉換相關函數:
#include <arpa/inet.h>
1)將32位二進位的主機字節序轉換為網絡字節序:
uint32_t htonl(uint32_t hostlong);
2)將16位二進位的主機字節序轉換為網絡字節序:
uint16_t htons(uint16_t hostshort);
3)將32位二進位的網絡字節序轉換為主機字節序:
uint32_t ntohl(uint32_t netlong);
4)將16位二進位的網絡字節序轉換為主機字節序:
uint16_t ntohs(uint16_t netshort);
2、IP位址轉換相關函數:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
1)將字符串形式的IP位址轉換為整數類型:
in_addr_t inet_addr(const char *cp);
2)
將結構體類型的IP位址轉換為字符串類型:
char *inet_ntoa(struct in_addr in);