多线程
int main(
int argc,char* argv[])
{
if(argc!=
3)
{
printf(
"Usage:%s [service ip][service port]\n",argv[
0]);
return 1;
}
int sock=
socket(AF_INET,SOCK_STREAM,
0);
//create ipv4
socket
struct sockaddr_in server_socket;
struct sockaddr_in client_socket;
bzero(&server_socket,sizeof(server_socket));
//fill addr port
server_socket.sin_family=AF_INET;
server_socket.sin_addr.s_addr=inet_addr(argv[
1]);
server_socket.sin_port=htons(atoi(argv[
2]));
if(
bind(sock,(struct sockaddr
*)&server_socket,sizeof(struct sockaddr_in))<
0)
{
perror(
"bind");
close(sock);
return 1;
}
if(
listen(sock,
10)<
0)
{
printf(
"listen error ,error code is %d,error string is :%s\n",errno,strerror(errno));
close(sock);
return 2;
}
printf(
"bind and listen sucess,wait accept..\n");
for(;;)
{
socklen_t len=sizeof(client_socket);
//int client_sock=
accept(sock,(struct sockaddr
*)&client_socket,&len);
//return fd
int new_sock=
accept(sock,(struct sockaddr
*)&client_socket,&len);
//return fd
if(new_sock<
0)
{
//perror(
"accept ");
continue;
}
printf(
"get new client!,[%s:%d]\n",\
inet_ntoa(client_socket.sin_addr)\
,ntohs(client_socket.sin_port));
char buf[
1024];
pid_t id=
fork();
//创建子进程
if(id<
0)
{
//perror(
"fork");
close(new_sock);
continue;
}
else if(id==
0)
{
//chilld
if(
fork()>
0)
{
exit(
0);
}
close(sock);
//...
//provide service
//
read &
write
while(
1)
{
ssize_t
s=
read(new_sock,buf,sizeof(buf));
if(
s>
0)
{
buf[
s]=
0;
printf(
"Client #:%s\n",buf);
write(new_sock,buf,strlen(buf));
}
else if(
s==
0)
{
printf(
"client quit!\n");
break;
}
else
{
perror(
"read");
}
}
}
else
{
//father
waitpid(id,NULL,
0);
close(new_sock);
}
close(new_sock);
}
return 0;
}
多线程
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<pthread.h>
void* request(
void* argc)
{
int new_sock=(
int)argc;
char buf[
1024];
while(
1)
{
ssize_t s=read(new_sock,buf,
sizeof(buf));
if(s>
0)
{
buf[s]=
0;
printf(
"Client #:%s\n",buf);
write(new_sock,buf,
strlen(buf));
}
else if(s==
0)
{
printf(
"client quit!\n");
}
else
{
perror(
"read");
}
}
close(new_sock);
}
int main(
int argc,
char* argv[])
{
if(argc!=
3)
{
printf(
"Usage:%s [service ip][service port]\n",argv[
0]);
return 1;
}
int sock=socket(AF_INET,SOCK_STREAM,
0);
struct sockaddr_in server_socket;
struct sockaddr_in client_socket;
bzero(&server_socket,
sizeof(server_socket));
server_socket.sin_family=AF_INET;
server_socket.sin_addr.s_addr=inet_addr(argv[
1]);
server_socket.sin_port=htons(atoi(argv[
2]));
if(bind(sock,(
struct sockaddr*)&server_socket,
sizeof(
struct sockaddr_in))<
0)
{
perror(
"bind");
close(sock);
return 1;
}
if(listen(sock,
10)<
0)
{
printf(
"listen error ,error code is %d,error string is :%s\n",errno,strerror(errno));
close(sock);
return 2;
}
printf(
"bind and listen sucess,wait accept..\n");
while(
1)
{
socklen_t len=
sizeof(client_socket);
int new_sock=accept(sock,(
struct sockaddr*)&client_socket,&len);
if(new_sock<
0)
{
perror(
"accept");
continue;
}
printf(
"get new client![%s:%d]\n",\
inet_ntoa(client_socket.sin_addr)\
,ntohs(client_socket.sin_port));
pthread_t pid;
pthread_create(&pid,NULL,request,(
void*)new_sock);
pthread_detach(pid);
}
close(sock);
return 0;
}