C語言實現基本伺服器與客戶端
伺服器程式碼:
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int res,listenfd,clientfd; //返回值,監聽套接字,客戶套接字
char buff[BUFSIZ]="";
int len;
struct sockaddr_in serveraddr; //地址型別
bzero(&serveraddr,sizeof(serveraddr)); //清空
serveraddr.sin_family=AF_INET; //使用AF_INET域
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); //可以連線到本伺服器的地址型別,即IP型別,這裡是任意型別
serveraddr.sin_port=htons(50002);//指定埠號
len=sizeof(serveraddr);
listenfd=socket(AF_INET,SOCK_STREAM,0); //建立套接字
bind(listenfd,(struct sockaddr*)&serveraddr,len);//命名套接字
listen(listenfd,23); //設定可連線的數量
clientfd=accept(listenfd,NULL,NULL); //接受連結
printf("connecct a client\n");
while(strncmp(buff,"end",3))
{
res=read(clientfd,buff,BUFSIZ); //從客戶端讀取資料
write(2,buff,res); //把資料顯示到顯示器,最好用write來顯示,如果用printf燈可能顯示上次留下的資料
write(clientfd,"server",6); //往客戶端寫資料
}
close(clientfd);//關閉客戶端
close(listenfd); //關閉監聽
exit(0);
}
客戶端程式碼:
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
int res,connfd,len; //返回值,連線套接字,地址長度
struct sockaddr_in connaddr; //客戶端要連結的伺服器的地址,應該與伺服器的地址一致
char buff[BUFSIZ];
bzero(&connaddr,sizeof(connaddr)); //清空套接字
if(argc<2)
{
printf("the option is too less\n");
exit(0);
}
connaddr.sin_family=AF_INET; //使用AF_INET域
connaddr.sin_addr.s_addr=inet_addr(argv[1]);//確定要連結的地址
connaddr.sin_port=htons(50002);//要連結的埠號
connfd=socket(AF_INET,SOCK_STREAM,0);//建立套接字
len=sizeof(connaddr);//獲取地址長度
connect(connfd,(struct sockaddr*)&connaddr,len);//建立連結
write(connfd,"Hello !",7);//往伺服器寫資料
while(res=read(connfd,buff,BUFSIZ))
{
printf("%d\n",res); //顯示收到的位元組數
res=read(fileno(stdin),buff,BUFSIZ); //從伺服器讀取資料
write(connfd,buff,res);
}
close(connfd);//關閉套接字
exit(0);
}
雖然每次伺服器,客戶端都會給對方傳送一個ACK來確認收到,但read函式一般不會讀取到,如果某一方傳送FIN或RST訊號,read都會當作讀到檔案尾來處理,即返回0;