/*
1.创建socket
2.命名套接字,绑定本地的ip地址和端口
3.监听本地套接字
4.接收连接
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define PORT 9999
int main()
{
//1.创建socket
int listen_socket = socket(AF_INET, SOCKET_STREAM,0);
if(listen_socket == -1)
{
perror("socket");
return -1;
}
//2.命名套接字,绑定本地的ip地址和端口
#if 0
struct sockaddr_in
{
short int sin_family; //Internet地址族
unsigned short int sin_port; //端口号
struct in_addr sin_addr; //IP地址
unsigned char sin_zero[8]; //填0
};
struct in_addr
{
unsigned long s_addr;
};
#endif
struct socketaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET; //设置地址族
addr.sin_port = htons(PORT); //设置本地端口
addr.sin_addr.s_addr = htonl(INADDR_ANY); //使用本地的任意IP地址
int ret = bind(listen_socket,(struct sockaddr *)&addr,sizeof(addr));
if(ret == -1)
{
perror("blind");
return -1;
}
//3.监听本地套接字
ret = listen(listen_socket,5);
if(ret == -1)
{
perror("listen");
return -1;
}
printf("等待 客户端连接......\n");
//4.接收连接
//监听套接字不能用来与客户端进行通信,他的职责是监听客户端的连接
//accept处理客户端的连接,如果接受成功,会返回一个新的套接字,用来与客户端进行通信
//accept的第三个参数,是一个传入传出参数
struct sockaddr_in client_addr;//用来保存客户端的ip和端口信息
int len = sizeof(client_addr);
int client_socket = accept(listen_socket,(struct sockaddr *)&client_addr,&len);
if(client_socket == -1)
{
perror("accept");
}
printf("成功接收一个客户端:%s\n",inet_ntoa(client_addr.sin_addr));
char buf[1024];
while(1)
{
int ret = read(client_socket,buf,1023);
buf[ret] = '\0';
printf("%s\n",buf);
}
return 0;
}