文件名:sever.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
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;