linux 简易socket

linux下socket简易客户端和服务器代码,做测试用

服务器代码

server.c监测任意地址通过端口SERV_PORT过来的连接

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
#include <sys/socket.h>
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define SERV_PORT 4564
#define LISTENQ 100
#define BUFF_SIZE 1024
int main(int argc,char *argv[])
{
int listenfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == listenfd)
{
perror(strerror(errno));
}
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(-1 == bind(listenfd,(struct sockaddr*)&servaddr,
sizeof(servaddr)))
{
perror(strerror(errno));
}
listen(listenfd, LISTENQ);
struct sockaddr_in client;
int n = sizeof(client);
int connetfd;
pid_t child_pid;
while(1)
{
connetfd = accept(listenfd,(struct sockaddr*)&client,
&n);
if(connetfd == -1)
{
perror(strerror(errno));
}
printf("有%s客户端的连接\n",inet_ntoa(client.sin_addr));
child_pid = fork();
if(child_pid == -1)
{
perror(strerror(errno));
}
if(child_pid == 0)
{
close(listenfd);
char buf[BUFF_SIZE] = {0};
time_t n = time(NULL);
struct tm *t;
t = localtime(&n);
sprintf(buf,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
write(connetfd,buf,strlen(buf));
printf("已经把%s发到%s\n",buf,inet_ntoa(client.sin_addr));
close(connetfd);
exit(0);
}
close(connetfd);
}
return 0;
}

客户端代码

客户端连接本地环回地址,端口为SERV_PORT

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
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define SERV_PORT 4564
#define BUFF_SIZE 1024
int main(int argc,char *argv[])
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
perror(strerror(errno));
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_aton(argv[1],&servaddr.sin_addr);
if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
perror(strerror(errno)),exit(0);
printf("连接到%s\n",argv[1]);
char buf[BUFF_SIZE] = {0};
read(sockfd,buf,sizeof(buf));
printf("%s\n",buf);
return 0;
}