1.服务端编程流程
2.服务端编程–具体实现
编程流程:
1、创建套接字—socket 处理地址和端口
2、套接字绑定本地的地址和端口—bind
3、套接字设定监听状态(等待客服端消息)–listen
4、接受消息,返回一个用连接的新套接字
5、新套接字通信—read,write
6、关闭套接字—close
/*********************************************************************************
* Copyright: (C) 2018 NULL
* All rights reserved.
*
* Filename: socket_server.c
* Description: This file
*
* Version: 1.0.0(2018年08月05日)
* Author: DingHuanhuan <[email protected]>
* ChangeLog: 1, Release initial version on "2018年08月05日 19时30分27秒"
*
********************************************************************************/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
/* sockaddr_in{} and other Internet define */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/* strerror(),perror(), errno head file */
#include <errno.h>
#define BUF_SIZE 1024
#define port 12345
#define IP_addr "192.168.2.2"
int main(int argc, char **argv)
{
int listen_fd,accept_fd; //创建两个套接字,一个开启连接,一个通信
struct sockaddr_in server_addr;//服务器端地址,是一个结构体,等下要填充ipV4或者ipV6的结构
char buf[BUF_SIZE];
listen_fd = socket(AF_INET,SOCK_STREAM,0);
if(listen_fd < 0)
{
printf("Creat socket failure:%s\n",strerror(errno));
return -1;
}
printf("Socket creat fd is %d\n",listen_fd);
/*服务器设置,设置server地址和端口号,用于接受任何client端*/
memset(&server_addr,0,sizeof(server_addr)); //清空再设置ipV4地址
server_addr.sin_family = AF_INET; //设置为ipV4地址
server_addr.sin_port = htons(port); //端口号,主机字节序转网络字节序,short是16位
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置host主机地址
if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)
{
printf("Bind socket failure %s\n",strerror(errno));
return -2;
}
printf("socket bind ok\n");
listen(listen_fd,15);//等待连接,最大连接数设为15
printf("socket listen ok\n");
printf("Start accept %d\n",listen_fd);
accept_fd = accept(listen_fd,NULL,NULL);
//accept接受的参数必须经过listen和bing处理过,返回一个新的socket码
//新的socket传送数据,旧的socket还能继续用accept接受请
//后面两个参数设置为NULL,那么会在系统连接时自动根据客户端信息填入
if(accept_fd <0)
{
printf("Listen socket failure: %s\n", strerror(errno)); //如果监听失败,打印错误信息
return -1;
}
printf("socked accept fd is %d\n",accept_fd);
while(1)
{
sleep(2);
memset(buf,0,BUF_SIZE);
send(accept_fd,"From\n",32,0);
sleep(2);
recv(accept_fd,buf, BUF_SIZE,0);
printf("read : %s\n",buf);
sleep(2);
}
close(accept_fd);
close(listen_fd);
return 0;
}