1 创建socket,返回一个文件描述符lfd---socket();
2 将lfd和IP,PROT进行绑定---bind();
3 将lfd由主动变成被动监听---listen();
4 接收一个新的连接,得到一个的文件描述符cfd--accept()'
--该文件描述符用于与客户端通信
5 while(1)
{
接受数据:read和recv
发送数据:write和send
}
6 关闭文件描述符:close(lfd)close(cfd);
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <sys/socket.h>
#include<arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
int main()
{//int socket(int domain, int type, int protocol);int lfd=socket(AF_INET,SOCK_STREAM ,0);if(lfd<0){perror("socket error");return -1;}struct sockaddr_in addr;bzero(&addr,sizeof(addr));//初始化置0addr.sin_family=AF_INET;addr.sin_port=htons(9999);//端口addr.sin_addr.s_addr=htonl(INADDR_ANY);//随机获得一个可使用IP// int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);int ret= bind(lfd,(struct sockaddr*)&addr,sizeof(addr));//绑定if(ret<0){perror("bind error");return -1;}// int listen(int sockfd, int backlog);listen(lfd,128);//监听//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);int cfd=accept(lfd,NULL,NULL);//获取连接if(cfd<0){perror("accept error");return -1;}int i;int n;char buf[64];while(1){memset(buf,0x00,sizeof(buf));n=read(cfd,buf,sizeof(buf));//读数据if(n<0||n==0)//n==0时为客户端关闭{printf("read error or client close\n");break;}printf("n==[%d],buf==[%s]\n",n,buf);for(i=0;i<strlen(buf);i++){buf[i]= toupper(buf[i]);//全部变大写}write(cfd,buf,strlen(buf));//发送给客户端}close(lfd);close(cfd);return 0;
}
结果:使用ifconfig -a查看本机IP
nc IP 端口 命令连接服务端
结果:
服务端结果:
通过以下操作可以通过accept函数获得客户端的IP地址和PROT端口:
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);struct sockaddr_in client_addr;socklen_t len=sizeof(client_addr);int cfd=accept(lfd,(struct sockaddr*)&client_addr,&len);char SIP[16];memset(SIP,0x00,sizeof(SIP));printf("client:IP==[%s],PROT==[%d]\n",inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,SIP,sizeof(SIP)),ntohs(client_addr.sin_port));//printf("client:IP==[%x],PROT==[%d]\n",ntohl(client_addr.sin_addr.s_addr),ntohs(client_addr.sin_port));