程式是網上找的,注釋很多都是看懂書後加上的 只是很簡單的程式
其中的乙個結構體可以查詢資料
其中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程式負責解析這些資料...