基于TCP-服务器
1,创建一个socket套接字
int socket(int domain,int type,int protocol)
domain:IP地址族,AF_INET(IPv4)、AF_INET6(IPv6)、AF_LOCAL/AF_UNIX(本地)
type:套接字,流式套接字(SOCK_STRAM),数字报套接字(SOCK_DGRAM),原始套接字(SOCK_RAM)
protocol:置0
2,邦定socket套接字和服务器相关资料
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)
sockfd:套接字描述符
addr:指向服务器sockaddr的指针
addrlen:参数addr的长度
成功为0,失败非0
3,设置允许客户端的最大连接数
int listen(int sockfd,int backlog)
backlog:连接数量
4、用来等待客户端的连接请求
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)
addr:指向客户端的sockaddr的指针
addrlen:参数addr的长度
例如:
服务器端time_server.c
1 /************************************************************************* 2 > File Name: sock_server.c 3 > Author: xu 4 > Mail: eeexu123@163.com 5 > Created Time: 2016年10月13日 星期四 16时13分24秒 6 ************************************************************************/ 7 8 #include9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #define MAX_LISTEN_QUE 518 #define BUFFER_SIZE 12819 20 int main(int argc,char *argv[])21 {22 int sockfd,listenfd;23 int bytes,opt=1;24 time_t timp;25 char buf[BUFFER_SIZE];26 struct sockaddr_in server,client;27 /*客户端程序开始建立sockfd描述符*/28 listenfd = socket(AF_INET,SOCK_STREAM,0);29 if(listenfd < 0)30 {31 perror("socket");32 exit(1);33 }34 /*使用套接字选项,避免出错*/35 if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) != 0)36 {37 perror("setsockopt");38 exit(1);39 }40 /*服务器填充sockaddr结构*/41 bzero(&server,sizeof(server)); //对结构体清零42 server.sin_family = AF_INET; //IPv4地址族43 server.sin_addr.s_addr = ntohl(INADDR_ANY); //服务器IP址址44 server.sin_port = ntohs(8888); //端口号45 46 /*邦定sockfd描述符到IP地址*/47 int len = sizeof(struct sockaddr);48 if(bind(listenfd,(struct sockaddr *)&server,len) != 0)49 {50 perror("bind");51 exit(1);52 }53 54 /*设置允许连接的最大客户数*/55 if(listen(listenfd,MAX_LISTEN_QUE) != 0)56 {57 perror("listen");58 exit(1);59 }60 while(1)61 {62 /*服务器阻塞,直到客户程序建立连接*/63 sockfd = accept(listenfd,(struct sockaddr *)&client,&len);64 if(sockfd < 0)65 {66 perror("accept");67 exit(1);68 }69 //提取时间70 timp = time(NULL);71 snprintf(buf,BUFFER_SIZE,"%s",ctime(&timp));72 //向客户端发送时间73 bytes = write(sockfd,buf,strlen(buf));74 if(bytes < 0)75 {76 perror("write");77 exit(1);78 }79 80 printf("buf is %s and buf size %d\n",buf,bytes);81 printf("IP:0X%x,PORT:%d\n",htonl(client.sin_addr.s_addr),htons(client.sin_port));82 //结束本次连接83 close(sockfd);84 }85 close(listenfd);86 return 0;87 }
客户端time_client.c
1 /************************************************************************* 2 > File Name: sock_client.c 3 > Author: xu 4 > Mail: eeexu123@163.com 5 > Created Time: 2016年10月13日 星期四 16时13分37秒 6 ************************************************************************/ 7 8 #include9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #define MAX_LISTEN_QUE 519 #define BUFFER_SIZE 12820 21 int main(int argc,char *argv[])22 {23 int sockfd,bytes;24 int buf[BUFFER_SIZE];25 struct sockaddr_in server;26 27 28 /*客户端程序开始建立sockfd描述符*/29 sockfd = socket(AF_INET,SOCK_STREAM,0);30 if(sockfd < 0)31 {32 perror("socket");33 exit(1);34 }35 /*客户端程序填充服务端资料*/36 bzero(&server,sizeof(server)); //初始化,置037 server.sin_family = AF_INET; //IPv438 server.sin_addr.s_addr = inet_addr("127.0.0.1"); //IP址址39 server.sin_port = htons(8888); 40 /*客户端程序发起连接请求*/41 if(connect(sockfd,(struct sockaddr *)&server,sizeof(server)) < 0)42 {43 perror("connetc");44 exit(1);45 }46 /*读取服务端时间*/47 bytes = read(sockfd,buf,BUFFER_SIZE);48 if(bytes < 0)49 {50 perror("read");51 exit(1);52 }53 if(0 == bytes)54 {55 printf("server close\n");56 exit(1);57 }58 printf("read bytes is :%d\n",bytes);59 printf("Time is :%s\n",buf);60 61 close(sockfd);62 return 0;63 }