【1】 atoi()
将字符串转化为整数
【2】
struct sockaddr_in serveraddr = {
.sin_family = AF_INET,
.sin_port = htons(atoi(argv[2])),
.sin_addr.s_addr = inet_addr(argv[1]),
};
【3】终端输入去 \n
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf) - 1] = '\0'; // 吃点\n
【4】获取客户端IP地址和端口号
struct sockaddr_in clientaddr;
accept(sockfd,(struct sockaddr *)&clientaddr,&clientlen);
系统自动填充clientaddr内容;
获取IP: inet_ntoa(clientaddr.sin_addr);
获取端口号:ntohs(clientaddr.sin_port);
【5】 if(argc < 3)
判断终端输入个数
argv[0] ==> ./server
argv[1] ==> 192.168.0.40
argv[2] ==> 8888
【6】
服务器可以绑定任意主机IP
htonl(INADDR_ANY);
//只能在服务器端使用;
【7】
客户端输入 quit ; 然后客户端关闭;
strncmp(buf,“quit”,4);
【8】ftp文件服务器
IO里面的;
伪代码:
服务器端:
1. socket();
2. 填充结构体
3. bind();
4. listen();
5.
while(1)
{
accept();
recv(buf);
switch(buf[0])
{
case 'L':
process_list();
case 'P':
process_put(int acceptfd,buf+2);// P filename
case 'G':
process_get();
case 'Q':
exit(0);
}
}
6.
process_put()
{
recv(buf)
//buf = (P + filename)
}
=======================================
客户端:
1. socket();
2. 填充结构体
3. connect();
4.
while(1)
{
printf("************list**********\n");
printf("*******put filename*******\n");
printf("*******get filename*******\n");
printf("***********quit **********\n");
fgets(buf);
// list
// put 1.c
// get server.c
switch(buf[0])
{
case 'l':
do_list(sockfd);
break;
case 'p':
do_put(sockfd,buf+4); //put 1.c
break;
case 'g':
do_get();
break;
default:
break;
}
}
close(fd);
5. 实现
do_list()
{
//封装一下字符
//发送具体要实现的功能(封装的字符发送给服务器)
// 发送 'L' ,告诉服务器是list请求;
send(sockfd,buf);
}
do_put(int sockfd, char *filename)
{
'P + filename' //先封装P,然后发送给服务器;
send();
open();
write();
}
do_get();
【9】
recvfrom
NAME
recv, recvfrom, recvmsg - receive a message from a socket
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能;用于接收数据,
参数:
1. sockfd ,sockfd
2. buf
3. sizeof(buf);
4. 0 表示阻塞
5. 想要关心数据具体是从哪个客户端来的,那么需要填充第5和6参数
如果不需要关心数据是从哪个客户端来的,填 NULL,NULL;
【10】sendto
NAME
send, sendto, sendmsg - send a message on a socket
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:发送数据,
参数:
dest_addr: 指定数据具体发送给谁
addrlen : 大小
【11】UDP中可以使用send函数,但是需要先使用connect函数,但不是用于连接,是指定具体数据是发送给谁。
【12】
1. UDP代码实现;
2. ftp文件服务器代码实现;