北城半夏4806197 的學(xué)生作業(yè):
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#define BACKLOG 10 //listen長度
int main(int argc, char const *argv[])
{
int sfd,ret,cfd;
struct sockaddr_in svr_addr,cli_addr;
socklen_t len = sizeof(struct sockaddr_in);
ssize_t rbytes = 0,sbytes=0;
char buffer[1024] = {0};
if(argc < 3)
{
fprintf(stderr,"Usage : %s ip port!\n",argv[0]);
exit(EXIT_FAILURE);
}
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1)
{
perror("[ERROR] socket():");
exit(EXIT_FAILURE);
}
bzero(&svr_addr,sizeof(svr_addr)); //清零
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons(atoi(argv[2]));
svr_addr.sin_addr.s_addr = inet_addr(argv[1]);
//綁定ip地址與端口號
ret = bind(sfd,(const struct sockaddr *)&svr_addr, sizeof(struct sockaddr_in));
if (ret == -1)
{
perror("[ERROR] bind()");
exit(EXIT_FAILURE);
}
//設(shè)置套接字為監(jiān)聽狀態(tài),建立監(jiān)聽隊列
ret = listen(sfd,BACKLOG);
if(ret == -1)
{
perror("[ERROR] listen():");
exit(EXIT_FAILURE);
}
//建立連接,并產(chǎn)生新的客戶端套接字cfd用于數(shù)據(jù)收發(fā)
cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len);
if(cfd == -1)
{
perror("[ERROR] accept():");
exit(EXIT_FAILURE);
}
printf("ip : %s , port : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
//客戶端從鍵盤接收發(fā)送數(shù)據(jù)
for(;;)
{
//從客戶端發(fā)送數(shù)據(jù)
rbytes = recv(cfd,buffer,sizeof(buffer),0);
if(rbytes == -1)
{
perror("[ERROR] recv():");
exit(EXIT_FAILURE);
}
else if(rbytes == 0)
{
printf("The server hsa been shut down.\n");
}
else if(rbytes > 0)
{
memset(buffer, 0, sizeof(buffer));
sbytes = send(cfd,buffer,sizeof(buffer),0);
if(sbytes == -1)
{
perror("[ERROR] send():");
exit(EXIT_FAILURE);
}
printf("Receive: %s\n", buffer);
if(strncmp(buffer,"quit",4) == 0)
break;
}
}
close(cfd);
close(sfd);
return 0;
}