學習網絡編程第一天~
客戶端程序:
#include "unp.h"
//該頭文件包含了大部分網絡程序所需要的系統頭文件
int main(int argc , char **argv){
int sockfd,n;
char recvline[MAXLINT+1];
struct sockaddr_in servaddr;
if(argc !=2 )
err_quit("usage:a.out < IPaddress>");
if((sockfd = socket(AF_INET,SOCK_STREAM,0)<0))//調用socket函數創建一個網際字節流(AF_INET)套接字,並使用sockfd來描述它
err_sys("socket error");//如果調用出錯,就使用err_sys來終止,err_sys輸出錯誤描述
bzero(&servaddr,sizeof(servaddr));//bzero類似於memset,將數組清空
servaddr.family = AF_INET;//置地址族爲AF_INET
servaddr.sinport() = htons(13);//端口號爲13(一個經常使用的端口),htons 主機到網絡短整數,轉換二進制端口號
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//inet_pton(呈現形式到數值),把ASCII轉換爲合適的格式
err_quit("*inet_pton err for %s", argv[1]);
if(connect(sockfd,(SA *) &servaddr,sizeof(servaddr))<0)//與第二個參數指定的套接字地址建立一個長度爲第三個參數的TCP連接
err_sys("connect error");
while((n=read(sockfd,recvline,MAXLINT))>=0){//返回0的時候是關閉,返回負值的時候是發生了錯誤
recvline[n]=0;
if(fputs(recvline,stdout)== EOF)
err_sys("fputs error");
}
if(n<0)
err_sys("read error");
exit(0);
}
服務器端程序:
#include "unp.h"
#include <time.h>
int main(int argc,char argv**){//命令行整數,和,字符串
int listenfd,connfd;
struct sockaddr_in,servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = Socket(AF_INET,SOCK_STREAM,0);//創建一個套接字
/* 這裏是一個包裹函數
int Socket(int family,int type,int protocol){
int n;
if(n=socket(family,type,protocol)<0)
err_sys("socket error");
return n;
}
*/
bzero (&servaddr,sizeof(servaddr));//清0
servaddr.sin_family = AF_INET;//ipv4地址協議族
servaddr.sin_addr.s_addr = htonl(INTADDR_ANY);//指定IP地址
servaddr.sin_port=htons(13);
Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));//將一個本地協議地址賦值給一個套接字
Listen(listenfd,LISTENQ);//把套接字轉換爲監聽套接字,LISTENQ是系統內核允許連接的最大連接數
for(;;){
connfd = Accept(listenfd,(SA *)NULL,NULL);//三路握手,在這個過程中,可能會進行休眠
ticks=time(NULL);//
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));//ticks,是一個秒數,ctime 將秒數轉換爲標準日期格式
Write(connfd,buff,strlen(buff));
Close(connfd);
}
}