公共头文件unp.h
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 7070
#define QUEUE_SIZE 5
#define BUFFER_SIZE 256
服务端ser.cpp 文件
#include"unp.h"
void* write_fun(void *arg)
{
int sockConn = *(int *)arg;
char sendbuf[BUFFER_SIZE];
memset(sendbuf, 0, BUFFER_SIZE);
while(1)
{
printf(":>");
scanf("%s",sendbuf);
if(strncmp(sendbuf,"quit",4) == 0)
break;
send(sockConn,sendbuf, strlen(sendbuf)+1, 0);
}
pthread_exit(NULL);
}
void* read_fun(void *arg)
{
int sockConn = *(int*)arg;
char recvbuf[BUFFER_SIZE];
memset(recvbuf,0,BUFFER_SIZE);
struct sockaddr_in addrCli;
socklen_t addrlen = sizeof(struct sockaddr);
while(1)
{
getsockname(sockConn, (struct sockaddr*)&addrCli, &addrlen);
recv(sockConn,recvbuf,BUFFER_SIZE, 0);
printf("Client[%d]:>%s\n",addrCli.sin_port,recvbuf);
}
}
int main()
{
int sockSer;
sockSer = socket(AF_INET, SOCK_STREAM, 0);
if(sockSer == -1)
perror("socket");
struct sockaddr_in addrSer,addrCli;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(SERVER_PORT);
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);
socklen_t addrlen = sizeof(struct sockaddr);
int res = bind(sockSer, (struct sockaddr*)&addrSer, addrlen);
if(res == -1)
perror("bind");
listen(sockSer, QUEUE_SIZE);
int sockConn;
while(1)
{
sockConn = accept(sockSer,(struct sockaddr*)&addrCli, &addrlen);
if(sockConn == -1)
perror("accept");
else
printf("Client[%d] Connect Server OK.\n",addrCli.sin_port);
pthread_t tid[2];
pthread_create(&tid[0], NULL, write_fun, &sockConn);
pthread_create(&tid[1], NULL, read_fun, &sockConn);
}
close(sockSer);
return 0;
}
客户端cli.cpp 文件
#include"unp.h"
pthread_t tid[2];
void* write_fun(void *arg)
{
int sockCli = *(int *)arg;
char sendbuf[BUFFER_SIZE];
memset(sendbuf, 0, BUFFER_SIZE);
while(1)
{
printf(":>");
scanf("%s",sendbuf);
if(strncmp(sendbuf,"quit",4) == 0)
{
pthread_cancel(tid[1]);
break;
}
send(sockCli,sendbuf, strlen(sendbuf)+1, 0);
}
pthread_exit(NULL);
}
void* read_fun(void* arg)
{
int sockCli = *(int*)arg;
char recvbuf[BUFFER_SIZE];
memset(recvbuf,0,BUFFER_SIZE);
struct sockaddr_in addrCli;
socklen_t addrlen = sizeof(struct sockaddr);
getsockname(sockCli, (struct sockaddr*)&addrCli, &addrlen);
while(1)
{
recv(sockCli,recvbuf,BUFFER_SIZE, 0);
printf("Server:>%s\n",recvbuf);
}
}
int main()
{
int sockCli;
sockCli = socket(AF_INET, SOCK_STREAM, 0);
if(sockCli == -1)
perror("socket");
struct sockaddr_in addrSer;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(SERVER_PORT);
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);
socklen_t addrlen = sizeof(struct sockaddr);
int res = connect(sockCli,(struct sockaddr*)&addrSer, addrlen);
if(res == -1)
perror("connect");
else
{
struct sockaddr_in addrCli;
getsockname(sockCli, (struct sockaddr*)&addrCli, &addrlen);
printf("Client[%d] Connect Server OK.\n", addrCli.sin_port);
}
pthread_create(&tid[0], NULL, write_fun, &sockCli);
pthread_create(&tid[1], NULL, read_fun, &sockCli);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
close(sockCli);
return 0;
}