功能
客户端发送字符串到服务器,服务器接受字符串并返回,客户端接收自己发送的字符串,并打印。
流程:正常流程
学习并作为一个简单案例为记录。
问题
在编程程序中,出现了一个问题,导致server一直监听不成功。
原因:在socket创建中,填写的是AF_INET, SOCK_DGRAM,填写的IP协议是是UDP协议,导致listen一直不成。
server
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include<sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include<signal.h>
using namespace std;
const int SERVER_PORT = 12345;
const int BUF_MAX_SIZE = 2048;
void sig_child(int signo){
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0){
cout<<"child "<<pid<<" teminated"<<endl;
}
return;
}
void readALL(int connfd, string &msg)
{
// echo msg
size_t t;
char buf[BUF_MAX_SIZE];
while (1)
{
int n = read(connfd, buf, BUF_MAX_SIZE);
string temp(buf, buf + n);
if (n < BUF_MAX_SIZE)
{
msg = msg + temp;
break;
}
else
msg = msg + temp;
}
}
void str_echo(int connfd)
{
string msg;
readALL(connfd, msg);
write(connfd, msg.c_str(), msg.size());
}
int main(int argc, char *args[])
{
int listenfd, connfd;
pid_t pid;
socklen_t childlen;
sockaddr_in clientaddr, serveraddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1)
{
cerr << "socket() err" << endl;
return 0;
}
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(atoi(args[1]));
if (bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{
cerr << "bind err" << endl;
return 0;
}
cout << "bind ..." << endl;
if (listen(listenfd, 5) == -1)
{
cerr << "listen err" << endl;
return 0;
}
cout << "listen ..." << endl;
signal(SIGCHLD, sig_child);
while (1)
{
sleep(3);
cout << "accpet ..." << endl;
childlen = sizeof(clientaddr);
connfd = accept(listenfd, (struct sockaddr *)&clientaddr, &childlen);
if ((pid = fork()) == 0)
{
//child process
close(listenfd);
str_echo(connfd);
return 0;
}
close(connfd);
}
}
clinet
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int BUF_MAX_SIZE = 2048;
void readALL(int connfd, string &msg)
{
// echo msg
size_t t;
char buf[BUF_MAX_SIZE];
while (1)
{
int n = read(connfd, buf, BUF_MAX_SIZE);
string temp(buf, buf + n);
if (n < BUF_MAX_SIZE)
{
msg = msg + temp;
break;
}
else
msg = msg + temp;
}
}
void str_send(int sockfd)
{
string msg;
getline(cin, msg);
write(sockfd, msg.c_str(), msg.size());
msg="";
readALL(sockfd, msg);
cout << msg << endl;
}
int main(int argv, char *args[])
{
int sockfd;
sockaddr_in serveraddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(args[1]);
serveraddr.sin_port = htons(atoi(args[2]));
if (connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{
cerr << "connect err" << endl;
}
str_send(sockfd);
close(sockfd);
}