原文:
Linux 下 简单客户端服务器通讯模型(TCP)
服务器端:server.c
#include<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<
string
.h>
#include
<sys/socket.h>
#include
<sys/types.h>
#include
<stdio.h>
#include
<unistd.h>
#include
<netdb.h>
#include
<netinet/
in
.h>
#define
ServerPort 6080
#define
MaxUser 8
typedef
struct
_server{
int
sock_fd;
int
new_fd;
struct
sockaddr_in my_addr;
} Server;
typedef
struct
_client{
int
sock_fd;
struct
sockaddr_in my_addr;
} Client;
static
Server *
server;
static
Client *
client;
void
socket_server_init(Server *
server){
server
-> my_addr.sin_family =
AF_INET;
server
-> my_addr.sin_port =
htons(ServerPort);
server
-> my_addr.sin_addr.s_addr =
INADDR_ANY;
bzero(
&(server -> my_addr.sin_zero),
8
);
}
int
socket_server_create_bind_listen(Server *
server){
int
sin_size,ret, on;
if
((server -> sock_fd = socket(AF_INET,SOCK_STREAM,
0
)) == -
1
){
perror(
"
faild to create socket :\n
"
);
return
-
1
;
}
on
=
1
;
ret
= setsockopt( server -> sock_fd, SOL_SOCKET, SO_REUSEADDR, &on,
sizeof
(on) );
if
(ret=bind(server ->
sock_fd,
(
struct
sockaddr *)&server ->
my_addr,
sizeof
(
struct
sockaddr))==-
1
){
perror(
"
failed to bind \n
"
);
return
-
1
;
}
if
(listen(server -> sock_fd,MaxUser)==-
1
){
perror(
"
failed to listen \n
"
);
return
-
1
;
}
return
1
;
}
void
server_send_msg(
int
fd){
char
buff[
1024
];
while
(
1
){
fgets(buff,
1024
,stdin);
if
(send(fd,buff,
1024
,
0
)==-
1
){
perror(
"
error to send :
"
);
break
;
}
}
}
void
server_wait_service(Server *server,Client *
client){
int
new_fd ,ret,sin_size;
char
buf[
1024
];
pthread_t tid;
sin_size
=
sizeof
(client ->
my_addr);
new_fd
= accept(server ->sock_fd,(
struct
sockaddr *)&client->my_addr,&
sin_size);
if
(new_fd <=
0
){
perror(
"
accept error :
"
);
}
else
{
ret
= pthread_create(&
tid,NULL,server_send_msg,new_fd);
if
(ret!=
0
){
perror(
"
error to create pthread
"
);
}
while
(
1
){
if
(recv(new_fd,buf,
sizeof
(buf),
0
)>
0
){
printf(
"
\nclient said:\t\t%s\n
"
,buf);
}
}
}
}
int
main(
int
arg,
char
*
argv[]){
server
= (Server *)malloc(
sizeof
(Server));
client
= (Client *)malloc(
sizeof
(Client));
socket_server_init(server);
if
(socket_server_create_bind_listen(server)){
server_wait_service(server,client);
}
return
0
;
}
客户端代码:client.c
#include<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<
string
.h>
#include
<sys/socket.h>
#include
<sys/types.h>
#include
<stdio.h>
#include
<netdb.h>
#define
ServerPort 6080
typedef
struct
_server{
int
sock_fd;
int
new_fd;
struct
sockaddr_in my_addr;
} Server;
typedef
struct
_client{
int
sock_fd;
struct
sockaddr_in my_addr;
} Client;
Server
*
server;
Client
*
client;
void
socket_server_init(Server *
server){
server
-> my_addr.sin_family =
AF_INET;
server
-> my_addr.sin_port =
htons(ServerPort);
server
-> my_addr.sin_addr.s_addr =
INADDR_ANY;
bzero(
&(server -> my_addr.sin_zero),
8
);
}
void
socket_client_init(Client *
client){
client
-> my_addr.sin_family =
AF_INET;
client
-> my_addr.sin_port = htons(ServerPort+
10
);
client
-> my_addr.sin_addr.s_addr =
INADDR_ANY;
bzero(
&(client -> my_addr.sin_zero),
8
);
}
int
socket_client_create_connect(Server * server,Client *
client){
if
((client -> sock_fd = socket(AF_INET,SOCK_STREAM,
0
)) == -
1
){
perror(
"
failed to create client socket \n
"
);
return
-
1
;
}
else
if
(connect(client ->
sock_fd,
(
struct
sockaddr *)&server ->
my_addr,
sizeof
(server ->my_addr))==-
1
){
printf(
"
failed to connect the server \n
"
);
return
-
1
;
}
else
return
1
;
}
void
client_recv_msg(Client *
client){
char
buf[
1024
];
while
(
1
){
if
(recv(client->sock_fd,buf,
sizeof
(buf),
0
)>
0
){
printf(
"
\nserver said :\t\t%s\n
"
,buf);
}
else
break
;
}
}
int
main(
int
argc,
char
*
argv[]){
server
= (Server *)malloc(
sizeof
(Server));
client
= (Client *)malloc(
sizeof
(Client));
char
data[
1024
];
socket_server_init(server);
socket_client_init(client);
pthread_t tid;
if
(socket_client_create_connect(server,client)){
pthread_create(
&
tid, NULL,client_recv_msg, client);
while
(
1
){
fgets(data,
1024
,stdin);
if
(send(client->sock_fd,data,
1024
,
0
)==-
1
){
perror(
"
error to send :
"
);
break
;
}
}
}
return
0
;
}
Makefile:
all: server client
server: server.c
gcc
-o server server.c -
pthread
client: client.c
gcc
-o client client.c -
pthread
clean:
rm
-f server client
执行效果:
server:
root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./server
client said: hello
hehe
client said: g
client said: goodbay
client:
root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./client
hello
server said : hehe
s^Hg
goodbay
去年的代码,做个备份。

