Linux Socket多进程通信【服务端】
Socket通信流程:
服务端代码:
#include<stdio.h>
#include<iostream>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include <string>
using namespace std;
int main() {
int s_fd, c_fd;
int resume = 0;
char buf[BUFSIZ];
int content_legth = 0;
pid_t tpid;
struct sockaddr_in serv_addr, client_addr;
socklen_t len = sizeof(client_addr);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(8888);
s_fd = socket(AF_INET, SOCK_STREAM, 0);
if (s_fd == -1) {
perror("socket create fail");
return 0;
}
setsockopt(s_fd, SOL_SOCKET, SO_REUSEADDR, &resume, sizeof(resume));
int n = bind(s_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (n == -1) {
perror("bind fail");
return 0;
}
int l = listen(s_fd, 30);
if (l == -1) {
perror("listen fail");
return 0;
}
while (true)
{
c_fd = accept(s_fd, (struct sockaddr *)&client_addr,&len);
if (c_fd < 0) {
perror("accept");
close(s_fd);
exit(-1);
}
cout << "IP:"<<inet_ntoa(client_addr.sin_addr) <<"建立连接," << "Port:" << htons(client_addr.sin_port) << endl;
tpid = fork();
if (tpid < 0) {
perror("fork create fail");
return 0;
}
else if (tpid==0)
{
close(s_fd);
break;
}else
{
close(c_fd);
}
}
if (tpid == 0) {
while (true)
{
content_legth = read(c_fd, buf, sizeof(buf));
string content = buf;
if (content_legth < 0) {
perror("client close!");
close(c_fd);
return 0;
}else{
cout <<"recv:" << content << endl;
content = "recv the information\n";
write(c_fd, content.data(), content.length());
}
}
}
else
{
close(s_fd);
}
return 0;
}