别摸我的键盘 的学生作业:
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
#define QUEUE_SZ 10
void *deal_accept_msg(void *arg){
int sockfd = *(int *)arg;
char buf[64];
ssize_t sz;
while(1){
memset(buf, 0, sizeof(buf));
sz = recv(sockfd, buf, sizeof(buf), 0);
if(-1 == sz){
perror("[ERROR] recv()");
pthread_exit(NULL);
}else if(sz == 0){
printf("client quit!\n");
break;
}
printf("recv data is --> %s\n", buf);
sz = send(sockfd, buf, strlen(buf), 0);
if(-1 == sz){
perror("[ERROR] send()");
break;
}
if(strncmp(buf, "quit", 4) == 0){
break;
}
}
close(sockfd);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
int sockfd,ret,csockfd;
struct sockaddr_in addr_in;
if(argc != 3){
fprintf(stderr, "[ERROR] %s \n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd= socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1){
perror("[ERROR] socket()");
exit(EXIT_FAILURE);
}
//清空 相当于memset()
bzero(&addr_in, sizeof(addr_in));
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(atoi(argv[2]));
addr_in.sin_addr.s_addr = inet_addr(argv[1]);
ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in));
if(ret == -1){
perror("[ERROR] bind()");
exit(EXIT_FAILURE);
}
ret = listen(sockfd, QUEUE_SZ);
if(-1 == ret){
perror("[ERROR] listen()");
exit(EXIT_FAILURE);
}
int len = sizeof(addr_in);
while(1){
csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len);
if(-1 == csockfd){
perror("[ERROR] accept()");
exit(EXIT_FAILURE);
}
pthread_t tid;
tid = pthread_create(&tid, NULL, deal_accept_msg, (void *)&csockfd);
if(-1 == tid){
perror("[ERROR] pthread_create()");
exit(EXIT_FAILURE);
}
pthread_detach(tid);
};
close(csockfd);
close(sockfd);
return 0;
}