一、網路程式設計之tcp流程
服務端:socket---bind---listen---while(1)---close
客戶端:socket----------------------------------connect---send---recv-----------------close
二、網路程式設計常用函式
伺服器端:
標頭檔案包含:
#include
#include
#include
#include
#include
#include
#include
#include
2. socket函式:生成乙個套介面描述符。
原型:int socket(int domain,int type,int protocol);
引數:domain->
type->{tcp:sock_streamudp:sock_dgram}
protocol->指定socket所使用的傳輸協議編號。通常為0.
返回值:成功則返回套介面描述符,失敗返回-1。
常用例項:int sfd = socket(af_inet, sock_stream, 0);
if(sfd == -1)
原型:int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
引數:sockfd->為前面socket的返回值。
my_addr->為結構體指標變數
對於不同的socket domain定義了乙個通用的資料結構
struct sockaddr //此結構體不常用
;此sockaddr結構會因使用不同的socket domain而有不同結構定義,
例如使用af_inet domain,其socketaddr結構定義便為
struct sockaddr_in //常用的結構體
;struct in_addr
;addrlen->sockaddr的結構體長度。通常是計算sizeof(struct sockaddr);
返回值:成功則返回0,失敗返回-1
常用例項:struct sockaddr_in my_addr; //定義結構體變數
memset(&my_addr, 0, sizeof(struct sockaddr)); //將結構體清空
//或bzero(&my_addr, sizeof(struct sockaddr));
my_addr.sin_family = af_inet; //表示採用ipv4網路協議
my_addr.sin_port = htons(8888); //表示埠號為8888,通常是大於1024的乙個值。
//htons()用來將引數指定的16位hostshort轉換成網路字元順序
my_addr.sin_addr.s_addr = inet_addr("192.168.0.101"); //inet_addr()用來將ip位址字串轉換成網路所使用的二進位制數字,如果為inaddr_any,這表示伺服器自動填充本機ip位址。
if(bind(sfd, (struct sockaddr*)&my_str, sizeof(struct socketaddr)) == -1)
(注:通過將my_addr.sin_port置為0,函式會自動為你選擇乙個未占用的埠來使用。同樣,通過將my_addr.sin_addr.s_addr置為inaddr_any,系統會自動填入本機ip位址。)
4. listen函式:使伺服器的這個埠和ip處於監聽狀態,等待網路中某一客戶機的連線請求。如果客戶端有連線請求,埠就會接受這個連線。
原型:int listen(int sockfd,int backlog);
引數:sockfd->為前面socket的返回值.即sfd
backlog->指定同時能處理的最大連線要求,通常為10或者5。最大值可設至128
返回值:成功則返回0,失敗返回-1
常用例項:if(listen(sfd, 10) == -1)
5. accept函式:接受遠端計算機的連線請求,建立起與客戶機之間的通訊連線。伺服器處於監聽狀態時,如果某時刻獲得客戶機的連線請求,此時並不是立即處理這個請求,而是將這個請求放在等待佇列中,當系統空閒時再處理客戶機的連線請求。當accept函式接受乙個連線時,會返回乙個新的socket識別符號,以後的資料傳輸和讀取就要通過這個新的socket編號來處理,原來引數中的socket也可以繼續使用,繼續監聽其它客戶機的連線請求。(也就是說,類似於移動營業廳,如果有客戶打**給10086,此時伺服器就會請求連線,處理一些事務之後,就通知乙個話務員接聽客戶的**,也就是說,後面的所有操作,此時已經於伺服器沒有關係,而是話務員跟客戶的交流。對應過來,客戶請求連線我們的伺服器,我們伺服器先做了一些繫結和監聽等等操作之後,如果允許連線,則呼叫accept函式產生乙個新的套接字,然後用這個新的套接字跟我們的客戶進行收發資料。也就是說,伺服器跟乙個客戶端連線成功,會有兩個套接字。)
原型:int accept(int s,struct sockaddr * addr,int * addrlen);
引數:s->為前面socket的返回值.即sfd
addr->為結構體指標變數,和bind的結構體是同種型別的,系統會把遠端主機的資訊(遠端主機的位址和埠號資訊)儲存到這個指標所指的結構體中。
addrlen->表示結構體的長度,為整型指標
返回值:成功則返回新的socket處理**new_fd,失敗返回-1
常用例項:struct sockaddr_in clientaddr;
memset(&clientaddr, 0, sizeof(struct sockaddr));
int addrlen = sizeof(struct sockaddr);
int new_fd = accept(sfd, (struct sockaddr*)&clientaddr, &addrlen);
if(new_fd == -1)
printf("%s %d success connect\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
6. recv函式:用新的套接字來接收遠端主機傳來的資料,並把資料存到由引數buf 指向的記憶體空間
原型:int recv(int sockfd,void *buf,int len,unsigned int flags);
引數:sockfd->為前面accept的返回值.即new_fd,也就是新的套接字。
buf->表示緩衝區
len->表示緩衝區的長度
flags->通常為0
返回值:成功則返回實際接收到的字元數,可能會少於你所指定的接收長度。失敗返回-1
常用例項:char buf[512] = ;
if(recv(new_fd, buf, sizeof(buf), 0) == -1)
puts(buf);
7. send函式:用新的套接字傳送資料給指定的遠端主機
原型:int send(int s,const void * msg,int len,unsigned int flags);
引數:s->為前面accept的返回值.即new_fd
msg->一般為常量字串
len->表示長度
flags->通常為0
返回值:成功則返回實際傳送出去的字元數,可能會少於你所指定的傳送長度。失敗返回-1
常用例項:if(send(new_fd, "hello", 6, 0) == -1)
8. close函式:當使用完檔案後若已不再需要則可使用close()關閉該檔案,並且close()會讓資料寫回磁碟,並釋放該檔案所占用的資源
原型:int close(int fd);
引數:fd->為前面的sfd,new_fd
返回值:若檔案順利關閉則返回0,發生錯誤時返回-1
常用例項:close(new_fd);
close(sfd);
客戶端:
1. connect函式:用來請求連線遠端伺服器,將引數sockfd 的socket 連至引數serv_addr 指定的伺服器ip和埠號上去。
原型:int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
引數:sockfd->為前面socket的返回值,即sfd
serv_addr->為結構體指標變數,儲存著遠端伺服器的ip與埠號資訊。
addrlen->表示結構體變數的長度
返回值:成功則返回0,失敗返回-1
常用例項:struct sockaddr_in seraddr;//請求連線伺服器
memset(&seraddr, 0, sizeof(struct sockaddr));
seraddr.sin_family = af_inet;
seraddr.sin_port = htons(8888); //伺服器的埠號
seraddr.sin_addr.s_addr = inet_addr("192.168.0.101"); //伺服器的ip
if(connect(sfd, (struct sockaddr*)&seraddr, sizeof(struct sockaddr)) == -1)
Linux網路程式設計常用函式
計算機資料儲存有兩種位元組優先順序 高位位元組優先和低位位元組優先。internet上資料以高位位元組優先順 序在網路上傳輸,所以對於在內部是以低位位元組優先方式儲存資料的機器,在internet上傳輸資料時就需 要進行轉換。我們要討論的第乙個結構型別是 struct sockaddr,該型別是用來...
Linux 網路程式設計常用函式詳解
sendto 經socket傳送資料 相關函式 send sendmsg,recv recvfrom socket 表頭檔案 include sys types.h include sys socket.h 定義函式 int sendto int s const void msg,int len,u...
linux網路程式設計常用函式詳解與例項
常用的網路命令 netstat telnet telnet是乙個用來遠端控制的程式,但是我們完全可以用這個程式來除錯我們的服務端程式的.比如我們的伺服器程式在監聽8888埠,我們可以用telnet localhost 8888來檢視服務端的狀況.網路函式描述和例項 int socket int do...