server:
int main()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);//(1)头文件sys/socket.h,建立套接字
assert(sockfd!=-1);
struct sockaddr_in saddr,caddr;//(2)给建立的套接字设置属性用于绑定
memset(saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(xxx);//头文件netinet/in.h,host to net short将十进制整数
转化为网络编码。short主要用于端口号,long用于ip地址,本程序用自定义局域网ip地址
所以使用inet_addr函数。
saddr.sin_addr.s_addr=inet_addr(xxx)//头文件arpa/inet.h自己设定的地址也可以
使用inet_aton,类似网络转十进制整数inet_ntoa.
int res=bind(sockfd,(sockaddr *)saddr,sizeof(saddr));//(3)绑定,将linux
特有的sockaddr_in转化为通用的sockaddr结构体绑定在sockfd上。
assert(res!=-1);
listen(sockfd,5)//(4)创建监听套接字等待三次握手
while(1)
{
int len=sizeof(caddr);
int c=accpet(sockfd,(sockaddr *)&caddr,&len);//(5)将完成3次握手的客户
端与套接字c建立一对一的交互模式。客户端信息在caddr中。sockfd继续监听。
if(c<0)
{
continue;
}
printf("ip=%s,port=%d\n",inet_ntoa(caddr.sin_addr.s_addr),ntohs(caddr.sin_port))
//由于是自主设定的ip局域网所以不使用ntohl,类似有htonl,ntohl,htons,ntohs。
while(1)
{
char buff[128]={0};
if(recv(c,buff,127,0)<=0)
{
break;
}
printf("buff=%s\n",buff);
send(c,"ok",2,0);
}
close(c);
}
}
cli:
int main()
{
int c=socket(AF_INET,SOCK_STREAM,0);
assert(c!=-1);
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(xxx);
saddr.sin_addr.s_addr=inet_aton("xx.xx.xx");
int res=connect(c,(sockaddr *)saddr,sizeof(saddr));
assert(res!=-1);
while(1)
{
char buff[128]={0};
fgets(buff,127,stdin);
if(compare(buff,"end",3)==0)
{
break;
}
send(c,buff,strlen(buff),0);
memset(buff,0,128);
recv(sockfd,buff,127,0);
printf("buff=%s\n",buff);
}
close(c);
}
int main()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);//(1)头文件sys/socket.h,建立套接字
assert(sockfd!=-1);
struct sockaddr_in saddr,caddr;//(2)给建立的套接字设置属性用于绑定
memset(saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(xxx);//头文件netinet/in.h,host to net short将十进制整数
转化为网络编码。short主要用于端口号,long用于ip地址,本程序用自定义局域网ip地址
所以使用inet_addr函数。
saddr.sin_addr.s_addr=inet_addr(xxx)//头文件arpa/inet.h自己设定的地址也可以
使用inet_aton,类似网络转十进制整数inet_ntoa.
int res=bind(sockfd,(sockaddr *)saddr,sizeof(saddr));//(3)绑定,将linux
特有的sockaddr_in转化为通用的sockaddr结构体绑定在sockfd上。
assert(res!=-1);
listen(sockfd,5)//(4)创建监听套接字等待三次握手
while(1)
{
int len=sizeof(caddr);
int c=accpet(sockfd,(sockaddr *)&caddr,&len);//(5)将完成3次握手的客户
端与套接字c建立一对一的交互模式。客户端信息在caddr中。sockfd继续监听。
if(c<0)
{
continue;
}
printf("ip=%s,port=%d\n",inet_ntoa(caddr.sin_addr.s_addr),ntohs(caddr.sin_port))
//由于是自主设定的ip局域网所以不使用ntohl,类似有htonl,ntohl,htons,ntohs。
while(1)
{
char buff[128]={0};
if(recv(c,buff,127,0)<=0)
{
break;
}
printf("buff=%s\n",buff);
send(c,"ok",2,0);
}
close(c);
}
}
cli:
int main()
{
int c=socket(AF_INET,SOCK_STREAM,0);
assert(c!=-1);
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(xxx);
saddr.sin_addr.s_addr=inet_aton("xx.xx.xx");
int res=connect(c,(sockaddr *)saddr,sizeof(saddr));
assert(res!=-1);
while(1)
{
char buff[128]={0};
fgets(buff,127,stdin);
if(compare(buff,"end",3)==0)
{
break;
}
send(c,buff,strlen(buff),0);
memset(buff,0,128);
recv(sockfd,buff,127,0);
printf("buff=%s\n",buff);
}
close(c);
}