Linux C 總結篇(socket編程)

物理地址:也叫實地址、二進制地址,它是在地址總線上,以電子形式存在的,使得數據總線能夠訪問主存的某個特定存儲單元的內存地址。

IP地址:爲互聯網上的每個網絡和每一臺主機所分配的一個邏輯地址,以此來屏蔽物理地址的差別。

端口:端口其實就是隊,操做系統爲各個進程分配了不一樣的隊,數據按照目的端口被推入相應的隊中,等待被該進程取用

socket 地址結構:

1.通用套接字地址:

struct sockaddr  { 
      unsigned short   sa_family;//套接字協議族類型 
      char sa_data[14]; //存儲具體的協議地址,最多使用14個字符長度。
   };

2.TCP/IP協議族地址:

struct socketaddr_in   { 
        unsigned short  sin_family;  //地址類型,**在TCP/IP的網絡編程中,只能是AF_INET**
        unsigned short int  sin_port;  //port編號
        struct in_addr sin_addr;  //IP 地址
        unsigned char   sin_zero[8];  //通常賦值爲0
   }; 

  struct in_addr  {  unsigned long  s_addr; }

說明:通常使用結構體struct socketaddr_in來設置地址,而後強制類型轉換爲struct sockaddr類型

一、建立套接字通訊:socket 函數

#include <sys/types.h>          
   #include <sys/socket.h>
   int socket(int domain, int type, int protocol); //protocol 一般設置爲 0

函數說明:向系統註冊,通知系統創建一通訊端口。參數domain 指定使用何種的地址類型,經常使用的有:

AF_UNIX 建立只在本機內進行通訊的套接字
 AF_INET  使用Ipv4 TCP/IP網絡協議
 AF_INET6  使用Ipv6 TCP/IP網絡協議

type有下列幾種數值:

SOCK_STREAM :TCP流套接字
    SOCK_DGREAM :UDP數據報套接字
    SOCK_RAW  :  原始套接字

返回值:成功則返回一個socket,失敗返回-1。

int sock_fd ;
    sock_fd = socket(AF_INET,SOCK_STREAM ,0); //建立套接字
    if(sock_fd < 0) myerror("socket",__LINE__);

二、創建socket連線:connect 函數(客戶端)

#include <sys/types.h>         
   #include <sys/socket.h>
   int connect(int sockfd, const struct sockaddr *addr,
               socklen_t addrlen);

函數說明:connect()用來將所建立的sock_fd連至參數serv_addr 指定的網絡地址,參數addrlen爲sockaddr的結構長度。

返回值

成功則返回0,失敗返回-1,錯誤緣由存於errno中web

memset(&serve_addr,0,sizeof(struct sockaddr_in)) ;
    serve_addr.sin_family =AF_INET ; //TCP 
    serve_addr.sin_port = htons(5285) ; //TCP 
    serve_addr.sin_addr.s_addr= inet_addr("127.0.0.1") ; //直接設置爲本地IP
    conn_fd = socket(AF_INET,SOCK_STREAM ,0 );
    if(conn_fd < 0)  myerror("client socket ",__LINE__);

    if(connect(conn_fd,(struct sockaddr *)&serve_addr,sizeof(struct sockaddr))   < 0)
        myerror("client connect ",__LINE__);

3. 綁定套接字:bind()函數(服務器端)

#include <sys/socket.h>

   int bind(int socket, const struct sockaddr *address,
          socklen_t address_len);

函數說明:將一個套接字與某個端口綁定

通常不對它進行操做,而是操做它的另外一個等價結構:

struct socketaddr_in   { 
        unsigned short  sin_family;  //地址類型
        unsigned short int  sin_port;  //port編號
        struct in_addr sin_addr;  //IP 地址
        unsigned char   sin_zero[8];  //未使用
   }; 

  struct in_addr  {  unsigned long  s_addr;

返回值

成功則返回0,失敗返回-1,錯誤緣由存於errno中。編程

一、accept(接受socket連線)

頭文件

#include sys/types.h    2 #include sys/socket.h

定義函數

int accept(int s,struct sockaddr * addr,int * addrlen);

函數說明:

accept()用來接受參數s的socket連線。參數s的socket必需先經bind()、listen()函數處理過,當有連線進來時 accept()會返回一個新的表明客戶端的套接字描述符,日後的數據傳送與讀取就是經由新的套接字描述符處理,而原來參數s的socket能繼續使用 accept()來接受新的連線要求。連線成功時,參數addr所指的結構會被系統填入遠程主機的地址數據,參數addrlen爲scokaddr的結構長度。關於結構sockaddr的定義請參考bind()。

錯誤代碼

EBADF 參數s 非合法socket處理代碼。
EFAULT 參數addr指針指向沒法存取的內存空間。
ENOTSOCK 參數s爲一文件描述詞,非socket。
EOPNOTSUPP 指定的socket並不是SOCK_STREAM。
EPERM 防火牆拒絕此連線。
ENOBUFS 系統的緩衝內存不足。
ENOMEM 核心內存不足。服務器

二、bind(對socket定位)

頭文件

#include<sys/types.h> 2 #include<sys/socket.h>

定義函數

int bind(int sockfd,struct sockaddr * my_addr,int addrlen); //addrlen爲sockaddr的結構長度。

函數說明:

四、htonl(將32位主機字符順序轉換成網絡字符順序)

頭文件

#include<netinet/in.h>

定義函數

unsigned long int htonl(unsigned long int hostlong);

函數說明

htonl()用來將參數指定的32位hostlong 轉換成網絡字符順序。網絡

返回值

返回對應的網絡字符順序。數據結構

五、htons(將16位主機字符順序轉換成網絡字符順序)

頭文件

#include<netinet/in.h>

定義函數

unsigned short int htons(unsigned short int hostshort);

函數說明

htons()用來將參數指定的16位hostshort轉換成網絡字符順序。app

返回值

返回對應的網絡字符順序。dom

六、inet_addr(將網絡地址轉成二進制的數字)

頭文件

#include<sys/socket.h> 
            #include<netinet/in.h>
             #include<arpa/inet.h>

定義函數

unsigned long int inet_addr(const char *cp);

函數說明

inet_addr()用來將參數cp所指的網絡地址字符串轉換成網絡所使用的二進制數字。網絡地址字符串是以數字和點組成的字符串,例
如:「163.13.132.68」。socket

返回值

成功則返回對應的網絡二進制的數字,失敗返回-1。tcp

七、inet_aton(將網絡地址轉成網絡二進制的數字)

頭文件

#include<sys/scoket.h> 
  #include<netinet/in.h>
   #include<arpa/inet.h>

定義函數

int inet_aton(const char * cp,struct in_addr *inp);

函數說明

inet_aton()用來將參數cp所指的網絡地址字符串轉換成網絡使用的二進制的數字,而後存於參數inp所指的in_addr結構中。
結構in_addr定義以下
struct in_addr
{
unsigned long int s_addr;
};svg

八、inet_ntoa(將網絡二進制的數字轉換成網絡地址)

頭文件

#include<sys/socket.h> 
  #include<netinet/in.h> 
   #include<arpa/inet.h>

定義函數

1 char * inet_ntoa(struct in_addr in);

函數說明

inet_ntoa()用來將參數in所指的網絡二進制的數字轉換成網絡地址,而後將指向此網絡地址字符串的指針返回。

返回值

成功則返回字符串指針,失敗則返回NULL。

九、listen(等待鏈接)

頭文件

#include<sys/socket.h>

定義函數

int listen(int s,int backlog);

函數說明

listen()用來等待參數s 的socket連線。參數backlog指定同時能處理的最大鏈接要求,若是鏈接數目達此上限則client端將收到
ECONNREFUSED的錯誤。 Listen()並未開始接收連線,只是設置socket爲listen模式,真正接收client端連線的是accept()。一般listen()
會在socket(),bind()以後調用,接着才調用accept()。

附加說明

listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。若是socket爲AF_INET則參數backlog 最大值可設至128。

錯誤代碼

EBADF 參數sockfd非合法socket處理代碼
EACCESS 權限不足
EOPNOTSUPP 指定的socket並未支援listen模式。

十、ntohl(將32位網絡字符順序轉換成主機字符順序)

頭文件

#include<netinet/in.h>

定義函數

unsigned long int ntohl(unsigned long int netlong);

函數說明

ntohl()用來將參數指定的32位netlong轉換成主機字符順序。

返回值

返回對應的主機字符順序。

十一、ntohs(將16位網絡字符順序轉換成主機字符順序)

頭文件

#include<netinet/in.h>

定義函數

unsigned short int ntohs(unsigned short int netshort);

函數說明

ntohs()用來將參數指定的16位netshort轉換成主機字符順序。

返回值

返回對應的主機順序。

十二、recv(經socket接收數據)

頭文件

#include<sys/types.h> 
   #include<sys/socket.h>

定義函數

int recv(int s,void *buf,int len,unsigned int flags);

函數說明

recv()用來接收遠端主機經指定的socket傳來的數據,並把數據存到由參數buf 指向的內存空間,參數len爲可接收數據的最大長度。

參數

flags通常設0。其餘數值定義以下:
MSG_OOB 接收以out-of-band 送出的數據。
MSG_PEEK 返回來的數據並不會在系統內刪除,若是再調用recv()會返回相同的數據內容。
MSG_WAITALL強迫接收到len大小的數據後才能返回,除非有錯誤或信號產生。
MSG_NOSIGNAL此操做不肯被SIGPIPE信號中斷返回值成功則返回接收到的字符數,失敗返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數s非合法的socket處理代碼
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷
EAGAIN 此動做會令進程阻斷,但參數s的socket爲不可阻斷
ENOBUFS 系統的緩衝內存不足。
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。

1三、recvfrom(經socket接收數據)

相關函數

recv,recvmsg,send,sendto,socket

頭文件

#include<sys/types.h>
   #include<sys/socket.h>

定義函數

1 int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);

函數說明

recv()用來接收遠程主機經指定的socket 傳來的數據,並把數據存到由參數buf 指向的內存空間,參數len 爲可接收數據的最大長度。參
數flags 通常設0,其餘數值定義請參考recv()。參數from用來指定欲傳送的網絡地址,結構sockaddr 請參考bind()。參數fromlen爲
sockaddr的結構長度。

返回值

成功則返回接收到的字符數,失敗則返回-1,錯誤緣由存於errno中。

錯誤代碼

EBADF 參數s非合法的socket處理代碼
EFAULT 參數中有一指針指向沒法存取的內存空間。
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此動做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。

1四、recvmsg(經socket接收數據)

頭文件

#include<sys/types.h>
   #include<sys/socktet.h>

定義函數

int recvmsg(int s,struct msghdr *msg,unsigned int flags);

函數說明

recvmsg()用來接收遠程主機經指定的socket傳來的數據。參數s爲已創建好連線的socket,若是利用UDP協議則不需通過連線操做。參數 msg指向欲連線的數據結構內容,參數flags通常設0,詳細描述請參考send()。關於結構msghdr的定義請參考sendmsg()。
返回值
成功則返回接收到的字符數,失敗則返回-1,錯誤緣由存於errno中。

錯誤代碼

EBADF 參數s非合法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此操做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。

1五、send(經socket傳送數據)

頭文件

1 #include

定義函數

1 int send(int s,const void * msg,int len,unsigned int falgs);

函數說明

send()用來將數據由指定的socket 傳給對方主機。參數s爲已創建好鏈接的socket。參數msg指向欲連線的數據內容,參數len則爲數據長
度。參數flags通常設0,其餘數值定義以下
MSG_OOB 傳送的數據以out-of-band 送出。
MSG_DONTROUTE 取消路由表查詢
MSG_DONTWAIT 設置爲不可阻斷運做
MSG_NOSIGNAL 此動做不肯被SIGPIPE 信號中斷。
返回值
成功則返回實際傳送出去的字符數,失敗返回-1。錯誤緣由存於errno

錯誤代碼

EBADF 參數s 非合法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此操做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。

1六、sendmsg(經socket傳送數據)

頭文件

1 #include

定義函數

1 int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);

函數說明

sendmsg()用來將數據由指定的socket傳給對方主機。參數s爲已創建好連線的socket,若是利用UDP協議則不需通過連線操做。參數msg
指向欲連線的數據結構內容,參數flags通常默認爲0,詳細描述請參考send()。
結構msghdr定義以下
複製代碼
1 struct msghdr 2 { 3 void msg_name; /*Address to send to /receive from . / 4 socklen_t msg_namelen; /* Length of addres data / 5 strcut iovec msg_iov; /* Vector of data to send/receive into / 6 size_t msg_iovlen; / Number of elements in the vector / 7 void msg_control; /* Ancillary dat / 8 size_t msg_controllen; / Ancillary data buffer length / 9 int msg_flags; / Flags on received message */ 10 };
複製代碼

返回值

成功則返回實際傳送出去的字符數,失敗返回-1,錯誤緣由存於errno

錯誤代碼

EBADF 參數s 非合法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此操做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。

1七、sendto(經socket傳送數據)

頭文件

1 #include < sys/types.h > 2 #include < sys/socket.h >

定義函數

1 int sendto ( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;

函數說明

sendto() 用來將數據由指定的socket傳給對方主機。參數s爲已建好連線的socket,若是利用UDP協議則不需通過連線操做。參數msg指向
欲連線的數據內容,參數flags 通常設0,詳細描述請參考send()。參數to用來指定欲傳送的網絡地址,結構sockaddr請參考bind()。參數
tolen爲sockaddr的結果長度。

返回值

成功則返回實際傳送出去的字符數,失敗返回-1,錯誤緣由存於errno 中。

錯誤代碼

EBADF 參數s非法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間。
WNOTSOCK canshu s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此動做會令進程阻斷,但參數s的soket爲補課阻斷的。
ENOBUFS 系統的緩衝內存不足。
EINVAL 傳給系統調用的參數不正確。

1八、socket(創建一個socket通訊)

頭文件

1 #include

定義函數

1 int socket(int domain,int type,int protocol);

函數說明

socket()用來創建一個新的socket,也就是向系統註冊,通知系統創建一通訊端口。參數domain 指定使用何種的地址類型,完整的定義 在/usr/include/bits/socket.h 內,底下是常見的協議: PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 進程通訊協議 PF_INET?AF_INET Ipv4網絡協議 PF_INET6/AF_INET6 Ipv6 網絡協議 PF_IPX/AF_IPX IPX-Novell協議 PF_NETLINK/AF_NETLINK 核心用戶接口裝置 PF_X25/AF_X25 ITU-T X.25/ISO-8208 協議 PF_AX25/AF_AX25 業餘無線AX.25協議 PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs PF_APPLETALK/AF_APPLETALK appletalk(DDP)協議 PF_PACKET/AF_PACKET 初級封包接口 參數 type有下列幾種數值: SOCK_STREAM 提供雙向連續且可信賴的數據流,即TCP。支持 OOB 機制,在全部數據傳送前必須使用connect()來創建連線狀態。 SOCK_DGRAM 使用不連續不可信賴的數據包鏈接 SOCK_SEQPACKET 提供連續可信賴的數據包鏈接 SOCK_RAW 提供原始網絡協議存取 SOCK_RDM 提供可信賴的數據包鏈接 SOCK_PACKET 提供和網絡驅動程序直接通訊。 protocol用來指定socket所使用的傳輸協議編號,一般此參考不用管它,設爲0便可。 返回值 成功則返回socket處理代碼,失敗返回-1。 錯誤代碼 EPROTONOSUPPORT 參數domain指定的類型不支持參數type或protocol指定的協議 ENFILE 核心內存不足,沒法創建新的socket結構 EMFILE 進程文件表溢出,沒法再創建新的socket EACCESS 權限不足,沒法創建type或protocol指定的協議 ENOBUFS/ENOMEM 內存不足 EINVAL 參數domain/type/protocol不合法

相關文章
相關標籤/搜索