可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。
服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。
服务器端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXBUF 1024
int
main(
int
argc,
char
*argv[])
{
int
pid;
int
sockfd, new_fd;
socklen_t len;
struct
sockaddr_in my_addr, their_addr;
unsigned
int
myport, lisnum;
char
buf[MAXBUF + 1];
if
(argv[2])
myport =
atoi
(argv[2]);
else
myport = 7575;
if
(argv[3])
lisnum =
atoi
(argv[3]);
else
lisnum = 5;
if
((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror
(
"socket"
);
exit
(EXIT_FAILURE);
}
bzero(&my_addr,
sizeof
(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(myport);
if
(argv[1])
my_addr.sin_addr.s_addr = inet_addr(argv[1]);
else
my_addr.sin_addr.s_addr = INADDR_ANY;
if
(bind(sockfd, (
struct
sockaddr *) &my_addr,
sizeof
(
struct
sockaddr))== -1)
{
perror
(
"bind"
);
exit
(EXIT_FAILURE);
}
if
(listen(sockfd,lisnum ) == -1)
{
perror
(
"listen"
);
exit
(EXIT_FAILURE);
}
printf
(
"wait for connect\n"
);
len =
sizeof
(
struct
sockaddr);
if
((new_fd =accept(sockfd, (
struct
sockaddr *) &their_addr,&len)) == -1)
{
perror
(
"accept"
);
exit
(EXIT_FAILURE);
}
else
printf
(
"server: got connection from %s, port %d, socket %d\n"
,inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);
if
(-1==(pid=fork()))
{
perror
(
"fork"
);
exit
(EXIT_FAILURE);
}
else
if
( pid == 0)
{
while
(1)
{
bzero(buf, MAXBUF + 1);
printf
(
"input the message to send:"
);
fgets
(buf, MAXBUF, stdin);
if
(!strncasecmp(buf,
"quit"
, 4))
{
printf
(
"i will close the connect!\n"
);
break
;
}
len = send(new_fd, buf,
strlen
(buf) - 1, 0);
if
(len < 0)
{
printf
(
"message'%s' send failure!errno code is %d,errno message is '%s'\n"
,
buf,
errno
,
strerror
(
errno
));
break
;
}
}
}
else
{
while
(1)
{
bzero(buf, MAXBUF + 1);
len = recv(new_fd, buf, MAXBUF, 0);
if
(len > 0)
printf
(
"message recv successful :'%s',%dByte recv\n"
,buf, len);
else
if
(len < 0)
{
printf
(
"recv failure!errno code is %d,errno message is '%s'\n"
,
errno
,
strerror
(
errno
));
break
;
}
else
{
printf
(
"the other one close quit\n"
);
break
;
}
}
}
close(new_fd);
close(sockfd);
return
0;
}
|
客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXBUF 1024
int
main(
int
argc,
char
**argv)
{
int
sockfd, len;
struct
sockaddr_in dest;
char
buffer[MAXBUF + 1];
if
(argc != 3)
{
printf
(
" error format,it must be:\n\t\t%s IP port\n"
,argv[0]);
exit
(EXIT_FAILURE);
}
if
((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror
(
"Socket"
);
exit
(
errno
);
}
printf
(
"socket created\n"
);
bzero(&dest,
sizeof
(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(
atoi
(argv[2]));
if
(inet_aton(argv[1], (
struct
in_addr *) &dest.sin_addr.s_addr) == 0)
{
perror
(argv[1]);
exit
(
errno
);
}
if
(connect(sockfd, (
struct
sockaddr *) &dest,
sizeof
(dest))==-1)
{
perror
(
"Connect "
);
exit
(
errno
);
}
printf
(
"server connected\n"
);
pid_t pid;
if
(-1==(pid=fork()))
{
perror
(
"fork"
);
exit
(EXIT_FAILURE);
}
else
if
(pid==0)
{
while
(1)
{
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if
(len > 0)
printf
(
"recv successful:'%s',%d byte recv\n"
,buffer, len);
else
if
(len < 0)
{
perror
(
"recv"
);
break
;
}
else
{
printf
(
"the other one close ,quit\n"
);
break
;
}
}
}
else
{
while
(1)
{
bzero(buffer, MAXBUF + 1);
printf
(
"pls send message to send:"
);
fgets
(buffer, MAXBUF, stdin);
if
(!strncasecmp(buffer,
"quit"
, 4))
{
printf
(
" i will quit!\n"
);
break
;
}
len = send(sockfd, buffer,
strlen
(buffer) - 1, 0);
if
(len < 0)
{
perror
(
"send"
);
break
;
}
}
}
close(sockfd);
return
0;
}
|
服务器端执行 : ./s 192.168.142.132 7575 5
客户端执行: ./c 192.168.142.132 7575
其中,192.168.142.132是本机的IP地址.
服务器端信息:
root@jieniyimiao-virtual-machine:/home/jieniyimiao/c_code/linux/ch13/sock_tcp_p_p_chat# ./s 192.168.142.132 7575 5
wait for connect
server: got connection from 192.168.142.132, port 44698, socket 4
input the message to send:jieniyimiap
input the message to send:ddddddddddddddddddddddddddd
input the message to send:dddddddddddddddddddddddddddd
input the message to send:aaaaaaaaaaaaaaaaaaaaaa
input the message to send:aaaaaaaaaaaaaaaaaaaaaaaa
input the message to send:message recv successful :'dddddddddddddddddd',18Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'dddddddddddddd',14Byte recv
message recv successful :'ddddddddddddddd',15Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'dddddddddddddd',14Byte recv
quit
i will close the connect!
客户端略:
用NETSTAT查看信息如下:
# netstat |grep 192.168.142.132
**********************************************************************************
tcp 0 0 192.168.142.132:7575 192.168.142.132:44698 ****
tcp 0 0 192.168.142.132:44698 192.168.142.132:7575 ****
from: http://www.open-open.com/lib/view/open1432210304630.html