赞
踩
文件名:sever.c
#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<stdlib.h> #include<netinet/in.h> #include<netinet/ip.h> #include<string.h> #include<arpa/inet.h> #include<unistd.h> int main(int argc, const char *argv[]) { if(argc<2) { fprintf(stderr,"usage:%s 8888",argv[0]); return 0; } int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { perror("Fail to socket"); return 0; } struct sockaddr_in saddr,caddr; //socklen_t caddr_len; memset(&saddr,0,sizeof(saddr)); memset(&caddr,0,sizeof(caddr)); saddr.sin_family=AF_INET; saddr.sin_port=htons(atoi(argv[1])); saddr.sin_addr.s_addr=htons(INADDR_ANY); int ret=bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)); if(ret<0) { perror("Fail to bind"); return 0; } ret =listen(sockfd,5); if(ret<0) { perror("Fail to listen"); return 0; } int caddr_len=0; caddr_len=sizeof(struct sockaddr); while(1) { int connfd=accept(sockfd,(struct sockaddr *)&caddr,&caddr_len); if(connfd<0) { perror("Fail to accept"); return 0; } char buf[1024]={0}; while(1) { memset(buf,0,sizeof(buf)); ret=read(connfd,buf,sizeof(buf)); if(ret==0) { printf("客户端异常退出!\n"); break; } else if(ret==-1) { perror("Fail to read"); break; } if(strncmp("quit",buf,4)==0) { printf("客户端主动退出!\n"); break; } printf("read: %d bytes:%s",ret,buf); write(connfd,buf,ret); } close(connfd); write(connfd,buf,ret); } close(sockfd); return 0; }
编译服务器,并运行。
gcc sever.c//编译
./a.out 8765 //运行服务器,8765为端口号
linux 中 nc 是tcp/udp调试工具(俗称脑残)
//把accept函数修改如下
int addr_len=0;
addr_len=sizeof(struct sockaddr);
int counnd=accept(sockfd,(struct sockaddr *)&caddr,&addr_len);
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
//返回值:成功返回通信套接字,失败返回-1;
//addr :客户端的地址结构的首地址;
//addrlen:客户端地址结构体的大小的首地址;
//注:若不想接受客户端的地址信息,addr与addrlen两个参数填NULL;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。