天天看點

unix/linux socket API reference

accept(接受socket連線)
相關函數 socket,bind,listen,connect
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 int accept(int s,struct sockaddr * addr,int * addrlen);
函數說明 accept ()用來接受參數s的socket連線。參數s的socket必需先經bind()、listen()函數處理過,當有連線進來時accept()會傳回一個新的socket處理代碼,往後的資料傳送與讀取就是經由新的socket處理,而原來參數s的socket能繼續使用accept()來接受新的連線要求。連線成功時,參數addr所指的結構會被系統填入遠端主機的位址資料,參數addrlen為scokaddr的結構長度。關于結構 sockaddr的定義請參考bind()。
傳回值 成功則傳回新的socket處理代碼,失敗傳回-1,錯誤原因存于errno中。
錯誤代碼

EBADF 參數s 非合法socket處理代碼。

EFAULT 參數addr指針指向無法存取的記憶體空間。

ENOTSOCK 參數s為一檔案描述詞,非socket。

EOPNOTSUPP 指定的socket并非SOCK_STREAM。

EPERM 防火牆拒絕此連線。

ENOBUFS 系統的緩沖記憶體不足。

ENOMEM 核心記憶體不足。

範例 參考listen()。
 
bind(對socket定位)
相關函數 socket,accept,connect,listen
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
函數說明

bind()用來設定給參數sockfd的socket一個名稱。此名稱由參數my_addr指向一sockaddr結構,對于不同的socket domain定義了一個通用的資料結構

struct sockaddr

{

unsigned short int sa_family;

char sa_data[14];

};

sa_family 為調用socket()時的domain參數,即AF_xxxx值。

sa_data 最多使用14個字元長度。

此sockaddr結構會因使用不同的socket domain而有不同結構定義,例如使用AF_INET domain,其socketaddr結構定義便為

struct socketaddr_in

{

unsigned short int sin_family;

uint16_t sin_port;

struct in_addr sin_addr;

unsigned char sin_zero[8];

};

struct in_addr

{

uint32_t s_addr;

};

sin_family 即為sa_family

sin_port 為使用的port編号

sin_addr.s_addr 為IP 位址

sin_zero 未使用。

參數 addrlen為sockaddr的結構長度。
傳回值 成功則傳回0,失敗傳回-1,錯誤原因存于errno中。
錯誤代碼

EBADF 參數sockfd 非合法socket處理代碼。

EACCESS 權限不足

ENOTSOCK 參數sockfd為一檔案描述詞,非socket。

範例 參考listen()
 
connect(建立socket連線)
相關函數 socket,bind,listen
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
函數說明 connect()用來将參數sockfd 的socket 連至參數serv_addr 指定的網絡位址。結構sockaddr請參考bind()。參數addrlen為sockaddr的結構長度。
傳回值 成功則傳回0,失敗傳回-1,錯誤原因存于errno中。
錯誤代碼

EBADF 參數sockfd 非合法socket處理代碼

EFAULT 參數serv_addr指針指向無法存取的記憶體空間

ENOTSOCK 參數sockfd為一檔案描述詞,非socket。

EISCONN 參數sockfd的socket已是連線狀态

ECONNREFUSED 連線要求被server端拒絕。

ETIMEDOUT 企圖連線的操作超過限定時間仍未有響應。

ENETUNREACH 無法傳送資料包至指定的主機。

EAFNOSUPPORT sockaddr結構的sa_family不正确。

EALREADY socket為不可阻斷且先前的連線操作還未完成。

範例

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#define PORT 1234

#define SERVER_IP “127.0.0.1”

main()

{

int s;

struct sockaddr_in addr;

char buffer[256];

if((s = socket(AF_INET,SOCK_STREAM,0))<0){

perror(“socket”);

exit(1);

}

bzero(&addr,sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_port=htons(PORT);

addr.sin_addr.s_addr = inet_addr(SERVER_IP);

if(connect(s,&addr,sizeof(addr))<0){

perror(“connect”);

exit(1);

}

recv(s,buffer,sizeof(buffer),0);

printf(“%s/n”,buffer);

while(1){

bzero(buffer,sizeof(buffer));

read(STDIN_FILENO,buffer,sizeof(buffer));

if(send(s,buffer,sizeof(buffer),0)<0){

perror(“send”);

exit(1);

}

}

}

執行

$ ./connect

Welcome to server!

hi I am client!

 
endprotoent(結束網絡協定資料的讀取)
相關函數 getprotoent,getprotobyname,getprotobynumber,setprotoent
表頭檔案 #include<netdb.h>
定義函數 void endprotoent(void);
函數說明 endprotoent()用來關閉由getprotoent()打開的檔案。
傳回值
範例 參考getprotoent()
 
endservent(結束網絡服務資料的讀取)
相關函數 getservent,getservbyname,getservbyport,setservent
表頭檔案 #include<netdb.h>
定義函數 void endservent(void);
函數說明 endservent()用來關閉由getservent()所打開的檔案。
傳回值
範例 參考getservent()。
 
getsockopt(取得socket狀态)
相關函數 setsockopt
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen);
函數說明 getsockopt()會将參數s所指定的socket狀态傳回。參數optname代表欲取得何種選項狀态,而參數optval則指向欲儲存結果的記憶體位址,參數optlen則為該空間的大小。參數level、optname請參考setsockopt()。
傳回值 成功則傳回0,若有錯誤則傳回-1,錯誤原因存于errno
錯誤代碼

EBADF 參數s 并非合法的socket處理代碼

ENOTSOCK 參數s為一檔案描述詞,非socket

ENOPROTOOPT 參數optname指定的選項不正确

EFAULT 參數optval指針指向無法存取的記憶體空間

範例

#include<sys/types.h>

#include<sys/socket.h>

main()

{

int s,optval,optlen = sizeof(int);

if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”);

getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);

printf(“optval = %d/n”,optval);

close(s);}

執行 optval = 1
 
htonl(将32位主機字元順序轉換成網絡字元順序)
相關函數 htons,ntohl,ntohs
表頭檔案 #include<netinet/in.h>
定義函數 unsigned long int htonl(unsigned long int hostlong);
函數說明 htonl()用來将參數指定的32位hostlong 轉換成網絡字元順序。
傳回值 傳回對應的網絡字元順序。
範例 參考getservbyport()或connect()。
 
htons(将16位主機字元順序轉換成網絡字元順序)
相關函數 htonl,ntohl,ntohs
表頭檔案 #include<netinet/in.h>
定義函數 unsigned short int htons(unsigned short int hostshort);
函數說明 htons()用來将參數指定的16位hostshort轉換成網絡字元順序。
傳回值 傳回對應的網絡字元順序。
範例 參考connect()。
 
inet_addr(将網絡位址轉成二進制的數字)
相關函數 inet_aton,inet_ntoa
表頭檔案

#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”。
傳回值 成功則傳回對應的網絡二進制的數字,失敗傳回-1。
 
inet_aton(将網絡位址轉成網絡二進制的數字)
相關函數 inet_addr,inet_ntoa
表頭檔案

#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;

};

傳回值 成功則傳回非0值,失敗則傳回0。
 
inet_ntoa(将網絡二進制的數字轉換成網絡位址)
相關函數 inet_addr,inet_aton
表頭檔案

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

定義函數 char * inet_ntoa(struct in_addr in);
函數說明 inet_ntoa()用來将參數in所指的網絡二進制的數字轉換成網絡位址,然後将指向此網絡位址字元串的指針傳回。
傳回值 成功則傳回字元串指針,失敗則傳回NULL。
 
listen(等待連接配接)
相關函數 socket,bind,accept,connect
表頭檔案 #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()。
傳回值 成功則傳回0,失敗傳回-1,錯誤原因存于errno
附加說明 listen()隻适用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數backlog 最大值可設至128。
錯誤代碼

EBADF 參數sockfd非合法socket處理代碼

EACCESS 權限不足

EOPNOTSUPP 指定的socket并未支援listen模式。

範例

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<unistd.h>

#define PORT 1234

#define MAXSOCKFD 10

main()

{

int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;

struct sockaddr_in addr;

int addr_len = sizeof(struct sockaddr_in);

fd_set readfds;

char buffer[256];

char msg[ ] =”Welcome to server!”;

if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){

perror(“socket”);

exit(1);

}

bzero(&addr,sizeof(addr));

addr.sin_family =AF_INET;

addr.sin_port = htons(PORT);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(sockfd,&addr,sizeof(addr))<0){

perror(“connect”);

exit(1);

}

if(listen(sockfd,3)<0){

perror(“listen”);

exit(1);

}

for(fd=0;fd<MAXSOCKFD;fd++)

is_connected[fd]=0;

while(1){

FD_ZERO(&readfds);

FD_SET(sockfd,&readfds);

for(fd=0;fd<MAXSOCKFD;fd++)

if(is_connected[fd]) FD_SET(fd,&readfds);

if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;

for(fd=0;fd<MAXSOCKFD;fd++)

if(FD_ISSET(fd,&readfds)){

if(sockfd = =fd){

if((newsockfd = accept (sockfd,&addr,&addr_len))<0)

perror(“accept”);

write(newsockfd,msg,sizeof(msg));

is_connected[newsockfd] =1;

printf(“cnnect from %s/n”,inet_ntoa(addr.sin_addr));

}else{

bzero(buffer,sizeof(buffer));

if(read(fd,buffer,sizeof(buffer))<=0){

printf(“connect closed./n”);

is_connected[fd]=0;

close(fd);

}else

printf(“%s”,buffer);

}

}

}

}

執行

$ ./listen

connect from 127.0.0.1

hi I am client

connected closed.

 
ntohl(将32位網絡字元順序轉換成主機字元順序)
相關函數 htonl,htons,ntohs
表頭檔案 #include<netinet/in.h>
定義函數 unsigned long int ntohl(unsigned long int netlong);
函數說明 ntohl()用來将參數指定的32位netlong轉換成主機字元順序。
傳回值 傳回對應的主機字元順序。
範例 參考getservent()。
 
ntohs(将16位網絡字元順序轉換成主機字元順序)
相關函數 htonl,htons,ntohl
表頭檔案 #include<netinet/in.h>
定義函數 unsigned short int ntohs(unsigned short int netshort);
函數說明 ntohs()用來将參數指定的16位netshort轉換成主機字元順序。
傳回值 傳回對應的主機順序。
範例 參考getservent()。
 
recv(經socket接收資料)
相關函數 recvfrom,recvmsg,send,sendto,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 傳給系統調用的參數不正确。

範例 參考listen()。
 
recvfrom(經socket接收資料)
相關函數 recv,recvmsg,send,sendto,socket
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 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 傳給系統調用的參數不正确。

範例

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

#include<sys/typs.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#define PORT 2345

#define SERVER_IP “127.0.0.1”

main()

{

int s,len;

struct sockaddr_in addr;

int addr_len =sizeof(struct sockaddr_in);

char buffer[256];

if((s = socket(AF_INET,SOCK_DGRAM,0))<0){

perror(“socket”);

exit(1);

}

bzero(&addr,sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_port = htons(PORT);

addr.sin_addr.s_addr = inet_addr(SERVER_IP);

while(1){

bzero(buffer,sizeof(buffer));

len =read(STDIN_FILENO,buffer,sizeof(buffer));

sendto(s,buffer,len,0,&addr,addr_len);

len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);

printf(“receive: %s”,buffer);

}

}

執行

(先執行udp server 再執行udp client)

hello

receive: hello

 
recvmsg(經socket接收資料)
相關函數 recv,recvfrom,send,sendto,sendmsg,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 傳給系統調用的參數不正确。

範例 參考recvfrom()。
 
send(經socket傳送資料)
相關函數 sendto,sendmsg,recv,recvfrom,socket
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 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 傳給系統調用的參數不正确。

範例 參考connect()
 
sendmsg(經socket傳送資料)
相關函數 send,sendto,recv,recvfrom,recvmsg,socket
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);
函數說明

sendmsg()用來将資料由指定的socket傳給對方主機。參數s為已建立好連線的socket,如果利用UDP協定則不需經過連線操作。參數msg 指向欲連線的資料結構内容,參數flags一般預設為0,較長的描述請參考send()。

結構msghdr定義如下

struct msghdr

{

void *msg_name;

socklen_t msg_namelen;

strcut iovec * msg_iov;

size_t msg_iovlen;

void * msg_control;

size_t msg_controllen;

int msg_flags;

};

傳回值 成功則傳回實際傳送出去的字元數,失敗傳回-1,錯誤原因存于errno
錯誤代碼

EBADF 參數s 非合法的socket處理代碼。

EFAULT 參數中有一指針指向無法存取的記憶體空間

ENOTSOCK 參數s為一檔案描述詞,非socket。

EINTR 被信号所中斷。

EAGAIN 此操作會令程序阻斷,但參數s的socket為不可阻斷。

ENOBUFS 系統的緩沖記憶體不足

ENOMEM 核心記憶體不足

EINVAL 傳給系統調用的參數不正确。

範例 參考sendto()。
 
sendto(經socket傳送資料)
相關函數 send , sendmsg,recv , recvfrom , socket
表頭檔案

#include < sys/types.h >

#include < sys/socket.h >

定義函數

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 傳給系統調用的參數不正确。

範例

#include < sys/types.h >

#include < sys/socket.h >

# include <netinet.in.h>

#include <arpa.inet.h>

#define PORT 2345

main(){

int sockfd,len;

struct sockaddr_in addr;

char buffer[256];

if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){

perror (“socket”);

exit(1);

}

bzero ( &addr, sizeof(addr) );

addr.sin_family=AF_INET;

addr.sin_port=htons(PORT);

addr.sin_addr=hton1(INADDR_ANY) ;

if (bind(sockfd, &addr, sizeof(addr))<0){

perror(“connect”);

exit(1);

}

while(1){

bezro(buffer,sizeof(buffer));

len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);

printf(“receive from %s/n “ , inet_ntoa( addr.sin_addr));

sendto(sockfd,buffer,len,0,&addr,addr_len);”

}

}

執行 請參考recvfrom()
 
setprotoent(打開網絡協定的資料檔案)
相關函數 getprotobyname, getprotobynumber, endprotoent
表頭檔案 #include <netdb.h>
定義函數 void setprotoent (int stayopen);
函數說明 setprotoent()用來打開/etc/protocols, 如果參數stayopen值為1,則接下來的getprotobyname()或getprotobynumber()将不會自動關閉此檔案。
 
setservent(打開主機網絡服務的資料檔案)
相關函數 getservent, getservbyname, getservbyport, endservent
表頭檔案 #include < netdb.h >
定義函數 void setservent (int stayopen);
函數說明 setservent()用來打開/etc/services,如果參數stayopen值為1,則接下來的getservbyname()或getservbyport()将補回自動關閉檔案。
 
setsockopt(設定socket狀态)
相關函數 getsockopt
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen);
函數說明

setsockopt()用來設定參數s所指定的socket狀态。參數level代表欲設定的網絡層,一般設成SOL_SOCKET以存取socket層。參數optname代表欲設定的選項,有下列幾種數值:

SO_DEBUG 打開或關閉排錯模式

SO_REUSEADDR 允許在bind()過程中本地位址可重複使用

SO_TYPE 傳回socket形态。

SO_ERROR 傳回socket已發生的錯誤原因

SO_DONTROUTE 送出的資料包不要利用路由裝置來傳輸。

SO_BROADCAST 使用廣播方式傳送

SO_SNDBUF 設定送出的暫存區大小

SO_RCVBUF 設定接收的暫存區大小

SO_KEEPALIVE 定期确定連線是否已終止。

SO_OOBINLINE 當接收到OOB 資料時會馬上送至标準輸入裝置

SO_LINGER 確定資料安全且可靠的傳送出去。

參數 optval代表欲設定的值,參數optlen則為optval的長度。
傳回值 成功則傳回0,若有錯誤則傳回-1,錯誤原因存于errno。
附加說明

EBADF 參數s并非合法的socket處理代碼

ENOTSOCK 參數s為一檔案描述詞,非socket

ENOPROTOOPT 參數optname指定的選項不正确。

EFAULT 參數optval指針指向無法存取的記憶體空間。

範例 參考getsockopt()。
 
shutdown(終止socket通信)
相關函數 socket,connect
表頭檔案 #include<sys/socket.h>
定義函數 int shutdown(int s,int how);
函數說明

shutdown()用來終止參數s所指定的socket連線。參數s是連線中的socket處理代碼,參數how有下列幾種情況:

how=0 終止讀取操作。

how=1 終止傳送操作

how=2 終止讀取及傳送操作

傳回值 成功則傳回0,失敗傳回-1,錯誤原因存于errno。
錯誤代碼

EBADF 參數s不是有效的socket處理代碼

ENOTSOCK 參數s為一檔案描述詞,非socket

ENOTCONN 參數s指定的socket并未連線

 
socket(建立一個socket通信)
相關函數 accept,bind,connect,listen
表頭檔案

#include<sys/types.h>

#include<sys/socket.h>

定義函數 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不合法

範例 參考connect()。