linux下的tcp套接字实现的回射服务器,也就是客户发送一段,服务器把这段返回给客户。
客户端
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERV_PORT 5566
#define CLIENT_PORT 5567
#define MAX_MESG_SIZE 1024
using namespace std;
int main()
{
int sockfd;
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_aton("127.0.0.1", &servaddr.sin_addr);
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket error");
return -1;
}
if((connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))<0)
{
printf("connect error!\n");
return -1;
}
char sendbuff[MAX_MESG_SIZE];
char recvbuf[MAX_MESG_SIZE];
while(fgets(sendbuff, MAX_MESG_SIZE, stdin) != NULL)
{
int n;
send(sockfd, sendbuff, strlen(sendbuff), 0);
if((n = recv(sockfd, recvbuf, MAX_MESG_SIZE, 0))>0)
{
recvbuf[n] = 0;
fputs(recvbuf, stdout);
}
}
return 0;
}
服务端:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERV_PORT 5566
#define MAX_MESG_SIZE 1024
using namespace std;
void my_echo(int connectfd);
int main()
{
int sockfd;
int connectfd;
pid_t childpid;
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
{
printf("socket error!\n");
return -1;
}
if((bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))<0)
{
printf("bind error!\n");
return -1;
}
if(listen(sockfd, 5) < 0)
{
printf("listen error!\n");
return -1;
}
while(1)
{
connectfd = accept(sockfd, NULL, NULL);
if((childpid = fork()) == 0)
{
close(sockfd);
my_echo(connectfd);
return 0;
}
close(connectfd);
}
return 0;
}
void my_echo(int connectfd)
{
ssize_t n;
char buff[MAX_MESG_SIZE];
while((n = recv(connectfd, buff, MAX_MESG_SIZE, 0)) > 0)
send(connectfd, buff, n, 0);
if(n < 0)
printf("read error!\n");
}