server端 接收来自不同client端发送的数据
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <fcntl.h>
int server_init(const char *ipstr, unsigned short port, int backflg)//封装server
{
int s = socket(AF_INET, SOCK_STREAM, 0);
if(0 > s)
{
perror("socket");
return -1;
}
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(port),
.sin_addr = {
.s_addr =(ipstr == NULL ? INADDR_ANY : inet_addr(ipstr)),
},
};
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
socklen_t len = sizeof(addr);
if(0 > bind(s, (struct sockaddr *)&addr, len))
{
perror("bind");
return -1;
}
if(0 > listen(s, backflg))
{
perror("listen");
return -1;
}
return s;
}
int process(int rws)
{
int pid = getpid();
#define MAX 1024
char buf[MAX+4];
while(1)
{
memset(buf, 0, MAX+4);
int ret = read(rws, buf, MAX);
if(0 >= ret)
{
printf("%d:%dleave\n", rws, pid);
close(rws);
break;
}
printf("RECV[%dbytes]:%s from %d:%d\n", ret, buf, rws, pid);
}
return 0;
}
int main()
{
int s = server_init(NULL, 8888, 0);
if(0 > s)
{
return -1;
}
while(1)
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
socklen_t len = sizeof(addr);
int rws = accept(s, (struct sockaddr *)&addr, &len);
if(0 > rws)
{
perror("accept");
return -1;
}
pid_t pid = fork();
if(0 > pid)
{
perror("fork");
break;
}
else if(0 == pid)
{
close(s);
process(rws);
exit(0);
}
}
return 0;
}
client端 不断向server端发送数据
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
unsigned short port;
char *ipstr;
if(argc == 3)
{
port = atoi(argv[2]);
ipstr = argv[1];
}
else
{
printf("Usga:%s<ip><port>\n", argv[0]);
return -1;
}
int s = socket(AF_INET, SOCK_STREAM, 0);
if(0 > s)
{
perror("socket");
return -1;
}
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(port),
.sin_addr = {
.s_addr = inet_addr(ipstr),
},
};
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
socklen_t len = sizeof(addr);
if(0 > connect(s, (struct sockaddr *)&addr, len))
{
perror("connect");
return -1;
}
int i = 0;
#define MAX 1024
char buf[MAX+4];
while(1)
{
memset(buf, 0, MAX+4);
snprintf(buf, MAX, "%dHello World", i++);
if(0 > send(s, buf, strlen(buf), 0))
{
perror("send");
close(s);
break;
}
printf("SND:%s\n", buf);
sleep(1);
}
return 0;
}
运行结果