您的位置:首页 > 其它

lisn_acp.c

2016-02-11 12:24 295 查看
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define PORT 2345

int main(void)
{
int sockfd,newsockfd;
struct sockaddr_in addr;
int addr_len=sizeof(struct sockaddr_in);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket created error!");
exit(1);
}
else
{
printf("socket created successfully!\nsocket id:%d\n",sockfd);
}

bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))<0)
{
perror("bind error!");
exit(1);
}
else
{
printf("bind port successfully!\nlocal port:%d\n",PORT);
}


/*
listen函数

头文件
#include<sys/socket.h>
int listen(int sockfd,int backlog);

参数
sockfd 是 已经建立的套接口
backlog 是同时处理的最大连接的请求数目

函数返回值:
若成功返回0  若失败返回-1

*/


if(listen(sockfd,5)<0)
{
perror("listen error!");
exit(1);
}
else
{
printf("listening ........\n");
}


/*
接收连接函数accept

头文件及函数原型
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr *addr,socketlen_t *addrlen);

参数含义:

sockfd    处于监听状态的socket
addr 是一个sockaddr结构体类型的指针,系统会把远程主机的信息保存到这个指针所指向的结构体中,
addrlen是sockaddr的内存长度,可以用sizeof函数来取得

函数的返回值:
若成功,返回新的套接口的的描述符,若失败,返回-1

当accept函数接收到一个连接时,会返回一个新的socket标识符,以后的数据传输与读取就是通过这个新的socket编号来处理的,原来参数中的socket也可以继续使用。接受连接后,远程主机的地址和端口信息就会保存到addr所指向的结构体中

*/


if((newsockfd=accept(sockfd,(struct sockaddr *)(&addr),&addr_len))<0)
{
perror("accept error!");
}
else
{
printf("accepted a new connecttion.\nnew socket id:%d\n",newsockfd);
}

return 0;
}


程序运行结果:

socket created successfully!
socket id:3
bind port successfully!
local port:2345
listening ........           //  程序运行到这里会一直等待,说明本地计算机的2345端口处于正在监听的状态。此时打开浏览器,输入 http://本机IP:2345/ 回车   表明已经接受了连接,并且创建了新的套接字
accepted a new connecttion.
new socket id:4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: