socket程式設計介面呼叫函式以及示例(C實現)

2021-05-22 19:41:38 字數 3243 閱讀 5035

關鍵字: linux-socket c實現

socket()

我們使用系統呼叫 socket() 來獲得檔案描述符: 

#include

#include

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

第乙個引數 domain 設定為 「af_inet」 。 

第二個引數是套介面的型別: sock_stream 或 

sock_dgram 。第三個引數設定為 0 。 

系統呼叫 socket() 只返回乙個套介面描述符,如果出錯,則返回 -1 。 

bind()

一旦你有了乙個套介面以後,下一步就是把套介面繫結到本地計算機的某乙個埠上。但如果你只想使用 connect() 則無此必要。 

下面是系統呼叫 bind() 的使用方法: 

#include

#include

intbind(int sockfd,struct sockaddr*my_addr,int addrlen);

第乙個引數 sockfd 是由 socket() 呼叫返回的套介面檔案描述符。 

第二個引數 my_addr 是指向資料結構 sockaddr 的指標。資料結構 sockaddr 中包括了關於你的位址、埠和 ip 位址的資訊。 

第三個引數 addrlen 可以設定成 sizeof(structsockaddr) 。 

下面是乙個例子: 

c** 

#include

#include

#include

#definemyport3490

main()  

if ((host = gethostbyname(argv[1])) == null)   

if ((sockfd = socket(af_inet, sock_stream, 0)) == -1)  

serv_addr.sin_family = af_inet;  

serv_addr.sin_port = htons(servport);  

serv_addr.sin_addr = *((struct in_addr *)host->h_addr);  

bzero(&(serv_addr.sin_zero), 8);  

if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)   

if ((recvbytes = recv(sockfd, buf, maxdatasize, 0)) ==-1)   

buf[recvbytes] = '/0';  

printf("received: %s",buf);  

close(sockfd);  

}  /*

客戶端程式首先通過伺服器網域名稱獲得伺服器的ip位址,然後建立乙個socket,呼叫connect函式與伺服器建立連線,連線成功之後接收從伺服器傳送過來的資料,最後關閉socket。

函式gethostbyname()是完成網域名稱轉換的。由於ip位址難以記憶和讀寫,所以為了方便,人們常常用網域名稱來表示主機,這就需要進行網域名稱和ip位址的轉換。函式原型為:

struct hostent *gethostbyname(const char *name);

函式返回為hosten的結構型別,它的定義如下:

struct hostent ;

#define h_addr h_addr_list[0] //在h-addr-list中的第乙個位址

當 gethostname()呼叫成功時,返回指向struct hosten的指標,當呼叫失敗時返回-1。當呼叫gethostbyname時,你不能使用perror()函式來輸出錯誤資訊,

應該使用herror()函式來輸出。

無連線的客戶/伺服器程式的在原理上和連線的客戶/伺服器是一樣的,兩者的區別在於無連線的客戶/伺服器中的客戶一般不需要建立連線,而且在傳送接收

資料時,需要指定遠端機的位址。

*/  

c** 

/*面向連線的socket例項

**例項中的伺服器通過socket連線向客戶端傳送字串"hello, you are connected!"。只要在伺服器上執行該伺服器軟體,在客戶端執行客戶軟體,客戶端就會收到該字串。

該伺服器軟體**如下:

*/#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define servport 3333     // 伺服器監聽埠號

#define backlog 10 // 最大同時連線請求數

main()  

my_addr.sin_family = af_inet;  

my_addr.sin_port = htons(servport);  

my_addr.sin_addr.s_addr = inaddr_any;  

bzero(&(my_addr.sin_zero), 8);  

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)   

if (listen(sockfd, backlog) == -1)   

while(1)   

printf("received a connection from %s/n", inet_ntoa(remote_addr.sin_addr));  

if (!fork())   

}  close(client_fd);  

}  }  

/*伺服器的工作流程是這樣的:首先呼叫socket函式建立乙個socket,然後呼叫bind函式將其與本機位址以及乙個本地埠號繫結,然後呼叫 listen在相應的socket上監聽,當accpet接收到乙個連線服務請求時,將生成乙個新的socket。伺服器顯示該客戶機的ip位址,並通過新的socket向客戶端傳送字串"hello,you are connected!"。最後關閉該socket。

**例項中的fork()函式生成乙個子程序來處理資料傳輸部分,fork()語句對於子程序返回的值為0。所以包含fork函式的if語句是子程序**部分,它與if語句後面的父程序**部分是併發執行的。*/

socket網路程式設計介面常用函式

3.listen函式 4.accept函式 5.connect函式 6.recv函式 7.closesocket shutdown 函式 中斷連線 int socket socket int af,int type,int protocol af 位址資料族系 type 通訊方式 protocal ...

Python呼叫遠端Socket介面

web應用通訊通常都喜歡用http介面,但不排除直接socket通訊的情況。socket除了server端構建麻煩些 需要考慮很多實際情況 對於呼叫者來說構建個client端其實不比http麻煩多少。usr bin env python coding utf 8 auther linvo impor...

socket程式設計中客戶端常用函式 以及簡單實現

int connect int sockfd,const struct sockaddr servaddr,socklen taddrlen 客戶端需要呼叫connect 連線伺服器,connect和bind的引數形式一致,區別在於bind的引數是自己的位址,而connect的引數是對方的位址。co...