基于TCP/IP的回声服务器 (Linux环境)
程序员文章站
2024-03-23 10:27:04
...
注意:
- 需要联网
- 需要修改IP地址为自己的IP地址。
ifconfig查看自己的IP地址
服务器端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUF_SIZE (4096)
void* server(void* arg)
{
int cli_fd = *(int*)arg;
char buf[BUF_SIZE];
for(;;)
{
// 接收数据
int recv_size = read(cli_fd,buf,BUF_SIZE);
if(0 >= recv_size || 0 == strcmp(buf,"quit"))
{
printf("客户端%d退出\n",cli_fd);
close(cli_fd);
pthread_exit(NULL);
}
printf("read:[%s],size:%d\n",buf,recv_size);
strcat(buf,":return");
// 发送数据
int send_size = write(cli_fd,buf,strlen(buf)+1);
if(0 >= send_size)
{
printf("客户端%d退出\n",cli_fd);
close(cli_fd);
pthread_exit(NULL);
}
}
}
int main()
{
// 创建socket对象
int svr_fd = socket(AF_INET,SOCK_STREAM,0);
if(0 > svr_fd)
{
perror("socket");
return -1;
}
// 准备通信地址(自己)
struct sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(6789);
addr.sin_addr.s_addr = inet_addr("192.168.43.92");
socklen_t addrlen = sizeof(addr);
// 绑定socket对象与地址
if(bind(svr_fd,(struct sockaddr*)&addr,addrlen))
{
perror("bind");
return -1;
}
// 设置监听和排除数量
if(listen(svr_fd,10))
{
perror("listen");
return -1;
}
for(;;)
{
// 等待连接
int cli_fd = accept(svr_fd,(struct sockaddr*)&addr,&addrlen);
if(0 > cli_fd)
{
perror("accept");
return -1;
}
// 创建线程服务客户端
pthread_t tid;
pthread_create(&tid,NULL,server,&cli_fd);
}
}
客户端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUF_SIZE (4096)
int main()
{
// 创建socket对象
int cli_fd = socket(AF_INET,SOCK_STREAM,0);
if(0 > cli_fd)
{
perror("socket");
return -1;
}
// 准备通信地址(服务端)
struct sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(6789);
addr.sin_addr.s_addr = inet_addr("192.168.43.92");
// 连接服务端
if(connect(cli_fd,(struct sockaddr*)&addr,sizeof(addr)))
{
perror("connect");
return -1;
}
char buf[4096];
for(;;)
{
printf(">>");
gets(buf);
int send_size = write(cli_fd,buf,strlen(buf)+1);
if(0 >= send_size || 0 == strcmp(buf,"quit"))
{
printf("结束通信!\n");
close(cli_fd);
return 0;
}
int recv_size = read(cli_fd,buf,BUF_SIZE);
if(0 >= recv_size)
{
printf("结束通信!\n");
close(cli_fd);
return 0;
}
printf("read:[%s],size:%d\n",buf,recv_size);
}
}