zz Unix下編寫Socket程式一般步驟

2021-04-14 15:08:36 字數 2883 閱讀 7229

unix下編寫socket程式的一般步驟

ackarlix

理解幾個常用的socket函式

#include

#include

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

domain指所使用的協議族(family)可以為af_unix和af_inet,一般只用af_inet(指internet)type指所用的傳輸型別,可以為sock_steram(面向連線的tcp),和sock_dgram(面向無連線的udp)

int bind(int s,const struct sockaddr *address,size_t address_len);

s為socket返回的檔案描述符

address為協議族名稱和其他資訊

具體結構為struct sockaddr_in;

int listen(int s,int backlog);

backlog為容許的請求數目

int accept(int s,struct sockaddr *address,int *address_len);

這裡的前兩個引數同上

addres_len是要傳遞乙個記有結構大小的位址

int connect(int s,struct sockaddr *address,size_t address_len);

這裡的引數意義同bind

2.理解建立程式的一般呼叫過程

要建立乙個處理連線的伺服器端程式,首先要呼叫socket函式建立乙個socket,返回乙個檔案控制代碼fd,使以後對它的操作就象對普通檔案裝置一樣讀寫。

由於是伺服器端必須對乙個斷口進行監聽其他機器的請求,所以接下去呼叫bind函式,傳入剛才的fd,定義好位址和埠,由於是要接受來自任何host的連線所以應講sin_addr賦為inaddr_any,port為你所設定的埠。

注意:這裡的位址和埠是網路位元組順序,所以要呼叫htonl,htons完成主機位元組順序到網路位元組的轉變。

接下來就是監聽listen,呼叫accept接受來自客戶端的請求,accpet返回連線後的檔案描述符,你就可以用它進行收發資訊(對應於read,write)這樣的乙個過程就是socket->bind->listen->accpet->read,write

而對於客戶端則是socket->connect->read,write

3.乙個完整的程式

#include

#include

#include /*包含有htons等函式的標頭檔案*/

#include

#include

void main()

int listenfd,clifd;

long pid;

struct sockaddr_in myaddr,cliaddr;

int ret;

int len;

listenfd=socket(af_inet,sock_stream,0);

if (listenfd<0)

perror("socket error");

exit(-1);

myaddr.sin_family=af_inet;

myaddr.sin_addr.s_addr=htonl(inaddr_any);

myaddr.sin_port=htons(8888);

ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));

if (ret<0)

perror("bind error");

exit(-1);

listen(listenfd,10);

len=sizeof(struct sockaddr);

while(1)

clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);

/*注意accept的第三個引數也是位址*/

if(clifd==-1)

perror("accept error");

continue;

printf("connect from %s %d/n",inet_ntoa(cliaddr.sin_addr.s_addr),

ntohs(cliaddr.sin_port));

switch(pid=fork())

case 0: /*子程序*/

close(listenfd);

;/*子程序進行其他的操作*/

close(clifd);

exit(0);

break;

case -1:

perror("fork error");

break;

default:/*父程序*/

close(clifd);

break;

4.程式說明

該程式的功能是監聽8888埠的連線,對所有的對8888埠的連線顯示出位址和對方的埠號該程式在sco unix下除錯通過,在其他unix和linux平台請注意inet_ntoa,htons函式所應在的標頭檔案的名稱

同時該程式用到了併發的觀點,因為accept,read,write均為阻塞(block)的函式,一旦程序block將不能處理其他請求,所以用主程序進行listen,由子程序進行負責對客戶端傳輸資料.

你可以在同一臺unix機器用telnet localhost 8888進行觀察程式會輸出connect from 127.0.0.1 ***x

unix下編寫socket程式的一般步驟

htons ntohl ntohs htons 函式 網路位元組順序與本地位元組順序之間的轉換 htonl host to network long ntohl network to host long htons host to network short ntohs network to hos...

如何編寫Socket套接字

socket套接字相當於網路通訊兩端的插座,只要對方的socket和自己的socket有通訊聯接,雙方就可以傳送和接收資料。其定義類似於檔案控制代碼的定義。如果編寫的是客戶端程式,則先呼叫socket 建立乙個套接字,然後呼叫connect 連線伺服器,之後就是呼叫send recv 傳送和接收資料...

使用perl編寫socket程式範例

伺服器端 usr bin perl use io socket sock io socket inet new localaddr 127.0.0.1 localport 8080,proto tcp listen 3,reuse 1 sock 2 sock accept while data cl...