/*************************************
文件名:server.c
linux下socket網路編程簡例-服務端程序
伺服器埠設為0x8888(埠和地址可根據實際情況更改,或者使用參數傳入)
伺服器地址設為192.168.1.104
作者:kikilizhm#163.com(將#換為@)
*/
#include<stdlib.h>
#include<sys/types.h>
#include<stdio.h>
#include<sys/socket.h>
#include<linux/in.h>
#include<string.h>
intmain()
{
intsfp,nfp;/*定義兩個描述符*/
structsockaddr_ins_add,c_add;
intsin_size;
unsignedshortportnum=0x8888;/*服務端使用埠*/
printf("Hello,welcometomyserver! ");
sfp=socket(AF_INET,SOCK_STREAM,0);
if(-1==sfp)
{
printf("socketfail! ");
return-1;
}
printf("socketok! ");
/*填充伺服器埠地址信息,以便下面使用此地址和埠監聽*/
bzero(&s_add,sizeof(structsockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);/*這里地址使用全0,即所有*/
s_add.sin_port=htons(portnum);
/*使用bind進行綁定埠*/
if(-1==bind(sfp,(structsockaddr*)(&s_add),sizeof(structsockaddr)))
{
printf("bindfail! ");
return-1;
}
printf("bindok! ");
/*開始監聽相應的埠*/
if(-1==listen(sfp,5))
{
printf("listenfail! ");
return-1;
}
printf("listenok ");
while(1)
{
sin_size=sizeof(structsockaddr_in);
/*accept服務端使用函數,調用時即進入阻塞狀態,等待用戶進行連接,在沒有客戶端進行連接時,程序停止在此處,
不會看到後面的列印,當有客戶端進行連接時,程序馬上執行一次,然後再次循環到此處繼續等待。
此處accept的第二個參數用於獲取客戶端的埠和地址信息。
*/
nfp=accept(sfp,(structsockaddr*)(&c_add),&sin_size);
if(-1==nfp)
{
printf("acceptfail! ");
return-1;
}
printf("acceptok! Serverstartgetconnectfrom%#x:%#x ",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
/*這里使用write向客戶端發送信息,也可以嘗試使用其他函數實現*/
if(-1==write(nfp,"hello,welcometomyserver ",32))
{
printf("writefail! ");
return-1;
}
printf("writeok! ");
close(nfp);
}
close(sfp);
return0;
}
/*************************************
文件名:client.c
linux下socket網路編程簡例-客戶端程序
伺服器埠設為0x8888(埠和地址可根據實際情況更改,或者使用參數傳入)
伺服器地址設為192.168.1.104
作者:kikilizhm#163.com(將#換為@)
*/
#include<stdlib.h>
#include<sys/types.h>
#include<stdio.h>
#include<sys/socket.h>
#include<linux/in.h>
#include<string.h>
intmain()
{
intcfd;/*文件描述符*/
intrecbytes;
intsin_size;
charbuffer[1024]={0};/*接受緩沖區*/
structsockaddr_ins_add,c_add;/*存儲服務端和本端的ip、埠等信息結構體*/
unsignedshortportnum=0x8888;/*服務端使用的通信埠,可以更改,需和服務端相同*/
printf("Hello,welcometoclient! ");
/*建立socket使用網際網路,TCP流傳輸*/
cfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==cfd)
{
printf("socketfail! ");
return-1;
}
printf("socketok! ");
/*構造伺服器端的ip和埠信息,具體結構體可以查資料*/
bzero(&s_add,sizeof(structsockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=inet_addr("192.168.1.104");/*ip轉換為4位元組整形,使用時需要根據服務端ip進行更改*/
s_add.sin_port=htons(portnum);/*這里htons是將short型數據位元組序由主機型轉換為網路型,其實就是
將2位元組數據的前後兩個位元組倒換,和對應的ntohs效果、實質相同,只不過名字不同。htonl和ntohl是
操作的4位元組整形。將0x12345678變為0x78563412,名字不同,內容兩兩相同,一般情況下網路為大端,
PPC的cpu為大端,x86的cpu為小端,arm的可以配置大小端,需要保證接收時位元組序正確。
*/
printf("s_addr=%#x,port:%#x ",s_add.sin_addr.s_addr,s_add.sin_port);/*這里列印出的是小端
和我們平時看到的是相反的。*/
/*客戶端連接伺服器,參數依次為socket文件描述符,地址信息,地址結構大小*/
if(-1==connect(cfd,(structsockaddr*)(&s_add),sizeof(structsockaddr)))
{
printf("connectfail! ");
return-1;
}
printf("connectok! ");
/*連接成功,從服務端接收字元*/
if(-1==(recbytes=read(cfd,buffer,1024)))
{
printf("readdatafail! ");
return-1;
}
printf("readok REC: ");
buffer[recbytes]='