最近开始学习网络编程,记录一下网络上老师视频上的代码
#include<netdb.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<signal.h>
#include<time.h>
int sockfd;
void sig_handler(int signo)//发送结束信号,停止总socket
{
if(signo == SIGINT )
{
printf("server close\n");
//6
close(sockfd);
exit(1);
}
}
void out_addr(struct sockaddr_in * clientaddr)//打印连接的客户端信息
{
char ip[16];
memset(ip, 0,sizeof(ip));
int port = ntohs(clientaddr->sin_port);
//inet_ntop(AF_INET, &clientaddr->sin_addr.s_addr, ip, sizeof(ip));
printf("client: %s(%d) connected\n", ip, port);
}
void do_service(int fd)//与客户端进行数据传输
{
long t = time(0);
char *s = ctime(&t);
size_t size = strlen(s)*sizeof(char);
if(write(fd, s, size) != size)//发送当前的时间到客户端
{
perror("write error");
}
}
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("usage: %s #port\n", argv[0]);
exit(1);
}
if(signal(SIGINT, sig_handler) == SIG_ERR)
{
printf("signal sigint error\n");
exit(1);
}
//1.创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
//2.绑定socket,调用bind函数将socket和地址(包括ip,port)进行绑定
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
//王地址中填入ip,port,Internet地址族类型
serveraddr.sin_family = AF_INET;//ipv4
serveraddr.sin_port = htons(atoi(argv[1]));//port端口
serveraddr.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind error\n");
exit(1);
}
/*3. 调用listen函数启动监听,将接受到的客户端连接放到队列中
*第二个参数是队列的长度
*/
if(listen(sockfd, 10) < 0)
{
perror("listen error\n");
exit(1);
}
/*4.调用accept函数从队列中获取一个客户端请求,并返回新的socket描述符,
*若没有客户端连接,则一直阻塞等待,直到有链接
*/
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(clientaddr);
while(1)
{
int fd = accept(sockfd, (struct sockaddr*)&clientaddr, &clientaddr_len);
if(fd < 0)
{
perror("accept error\n");
continue;
}
//5.调用io函数与连接的客户端进行双向通信
out_addr(&clientaddr);
do_service(fd);
close(fd);//6.当前通信完成,关闭当前的socket
}
return 0;
}