服务器端代码如下:
#include"apue.h"
#define SERVER_PORT 8888
static int sfd;
void init_network()
{
int ret;
struct sockaddr_in addr;
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0){
perror("socket()");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(sfd,(struct sockaddr*)&addr,sizeof(addr));
if(ret != 0)
{
perror("bind()");
exit(1);
}
int val = 1;
int rset = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(int));
if(rset == -1)
{
printf("setsockopt");
exit(1);
}
listen(sfd,20);
}
void destory_network()
{
close(sfd);
}
int main()
{
int afd;
struct sockaddr_in peer_addr;
time_t t;
char buf[64];
struct tm *ptm;
socklen_t addr_len;
init_network();
while(1){
addr_len = sizeof(peer_addr);
afd = accept(sfd,(struct sockaddr*)&peer_addr,&addr_len);
printf("connect %s %d \n",inet_ntoa(peer_addr.sin_addr),ntohs(peer_addr.sin_port));
t = time(NULL);
ptm = localtime(&t);
sprintf(buf,"%d-%d-%d %d:%d:%d",
ptm->tm_year+1900,
ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
write(afd,buf,sizeof(buf));
close(afd);
}
close_network();
return 0;
}
客户端代码如下:
#include"apue.h"
#define SERVER_PORT 8888
int main(int argc,char **argv)
{
int sfd;
int ret;
char buf[64];
struct sockaddr_in addr;
time_t t;
struct tm *ptm;
if(argc != 2)
{
perror("Usage: need server's IP");
return -1;
}
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = inet_addr(argv[1]);
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
perror("socket()");
return -1;
}
ret = connect(sfd,(struct sockaddr*)&addr,sizeof(addr));
if(ret != 0)
{
perror("connect");
return -1;
}
bzero(buf,64);
read(sfd,buf,sizeof(buf));
printf("buf:%s\n",buf);
close(sfd);
return 0;
}
#include"apue.h"
#define SERVER_PORT 8888
int main(int argc,char **argv)
{
int sfd;
int ret;
char buf[64];
struct sockaddr_in addr;
time_t t;
struct tm *ptm;
if(argc != 2)
{
perror("Usage: need server's IP");
return -1;
}
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = inet_addr(argv[1]);
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
perror("socket()");
return -1;
}
ret = connect(sfd,(struct sockaddr*)&addr,sizeof(addr));
if(ret != 0)
{
perror("connect");
return -1;
}
bzero(buf,64);
read(sfd,buf,sizeof(buf));
printf("buf:%s\n",buf);
close(sfd);
return 0;
}
字节序: 由处理器决定,字节序指高 / 低字节 分别存储在高 / 低地址。
低字节存储在高地址处,高字节存储在低地址处 常见的x86服务器是小端字节序。
高字节存储在高地址处,低字节存储在低地址处 常见的是ARM处理器 网络端字节序 大端。
long 长整形,short 短整形
服务器端:socket ->bind->listen ->accept ->read/write->close
客户端: socket->connect->read/write->close;