8 24 linux c socket 簡單實現

2021-06-28 02:45:50 字數 2888 閱讀 6103

程式是網上找的,注釋很多都是看懂書後加上的  只是很簡單的程式

其中的乙個結構體可以查詢資料

其中server端 :

#include

#include

#include

#include

#include

#include

int main()

printf("socket is ok! \n");

//填充伺服器埠位址資訊,以便下面使用此位址和埠監聽

bzero(&s_add,sizeof(struct sockaddr_in));/*  extern void bzero(void *s, int n);

置位元組字串s的前n個位元組為零且包括『\0』。*/

s_add.sin_family=af_inet;//af_inet   ipv4網際網路協議

s_add.sin_addr.s_addr = htonl(inaddr_any);//自動填出ip位址

s_add.sin_port = htons(portnum);//埠號

/*使用bind進行繫結埠  函式:int bind(int sockfd, const struct sockaddr *addr,socklen_len len)

*   指明函式套接字將使用本地的哪乙個協議埠進行資料傳送(ip位址和埠號),協議位址addr是通用位址,len是

*  該位址結構(第二個引數)的長度。一般而言,伺服器呼叫此函式,而客戶端則很少呼叫它

*/if(-1 == bind(sfp,(struct sockaddr *)(&s_add),sizeof(struct sockaddr)))

printf("bind ok ! \n");

/*int listen(int sockfd, int backlog)

*作用:將為連線的套接字轉換成被動套接字,提示核心應該接受指向此套接字的連線請求;第二個引數規定了核心為此套接

*字排隊的最大連線個數

*/     

if(-1 == listen(sfp, 5))

printf("listen ok \n" );

while (1)

printf("accept ok! \r\n server start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port) );

//ntohl()是將乙個無符號長整形數從網路位元組順序轉換為主機位元組順序。

//這裡使用write向客戶端傳送資訊

if(-1 == write(nfp,"hello,welcome to my server \r\n",32))

printf("write ok \r\n");

close(nfp);

}return 0;

}client端:

#include

#include

#include

#include

#include

#include

int main(void)

;struct sockaddr_in s_add, c_add;

unsigned short portnum = 0x8888;

printf("hello,welcome to client !\r\n ");

//建立socket 使用網際網路,tcp流傳輸

cfp  = socket(af_inet, sock_stream, 0);

if(-1  == cfp)

printf("socket ok !\r\n");

//構建伺服器端的ip和埠資訊,具體結構可以查資料

bzero(&s_add,sizeof(struct sockaddr_in));

s_add.sin_family = af_inet;

s_add.sin_addr.s_addr =inet_addr("192.168.1.106");  //ip位址根據自己情況而定

s_add.sin_port = htons(portnum);/* 這裡htons是將short型資料字節序由主機型轉換為網路型,其實就是 

將2位元組資料的前後兩個位元組倒換,和對應的ntohs效果、實質相同,只不過名字不同。htonl和ntohl是 

操作的4位元組整形。將0x12345678變為0x78563412,名字不同,內容兩兩相同,一般情況下網路為大端, 

ppc的cpu為大端,x86的cpu為小端,arm的可以配置大小端,需要保證接收時位元組序正確。 

*/printf("s_add = %#x,port :%#x\r\n",s_add.sin_addr.s_addr, s_add.sin_port);

/*  int connet(int sockfd, const struct sockaddr *addr,socklen_t addrlen)**/

if(-1 == connect(cfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

printf("connect ok !\r\n");

//鏈結成功, 從伺服器端接收字元

if(-1 == (recbytes = read(cfp,buffer,1024)))

printf("read ok \r\nrec: \r\n");

buffer[recbytes] = '\0';

printf("%s\r\n", buffer);

getchar();//此句為使程式暫停在此處,可以使用netstat檢視當前的鏈結

close(cfp);

return 0;

}執行結果:

server:

client:

linux c socket程式設計

這裡主要是 網上有原理 socket 有同步,非同步之分,我這是個同步的,同步又有阻塞和非阻塞之分,這的非阻塞是用select 函式實現的 客戶端 include include include include include include include include include incl...

linux c socket程式設計

ntohl 與 htonl 相反的過程 ntohs 與htons 相反的過程 inet addr char 點分十進位制轉化為整型 inet nota int 整型轉化為點分十進位制 主機位元組序 和 網路位元組序 當主機位元組序埠號位為 0x1234 那麼 網路位元組序就為 0x12 0x34 如...

linux C socket程式設計

這是乙個關於socket的題 要求你自己寫乙個socket程式,然後解析客戶端從瀏覽器位址列提交的資料。要求 在瀏覽器中輸入http localhost 8500 後,你的socket程式向瀏覽器返回乙個網頁,以後就用這個網頁向你寫得這個socket程式提交資料,你的socket程式負責解析這些資料...