文章目录
服务端
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<stdlib.h>
#include<pthread.h>
void *run(void *arg);
int main(){
//lfd:socket返回的文件描述符,用lfd监听并接受客户端连接
//cfd:客户端链接上来返回的cfd,用cfd和客户端通信
int lfd,cfd;
char client_ip[128];
//serv_addr服务器地址
//client_addr客户端地址
struct sockaddr_in serv_addr,client_addr;
socklen_t client_len;
pthread_t tid;
//socket创建服务器返回lfd文件描述符
lfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&serv_addr,sizeof(serv_addr));
//ipv4
serv_addr.sin_family = AF_INET;
//端口 本地字节序转网络字节序 host to net short 大小端存储问题
serv_addr.sin_port = htons(9999);
//ip host to net long
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//bind
bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
//监听是否有客户连接
listen(lfd,128);
printf("wait for connect...\n");
while(1){
client_len = sizeof(client_addr);//客户端地址长度
//连接成功返回cfd,用cfd和客户通信
cfd = accept(lfd,(struct sockaddr*)&client_addr,&client_len);
printf("client:%s\t%d\n",
inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,sizeof(client_ip)),
ntohs(client_addr.sin_port));
//创建线程 回调 run方法 cfd做参数传入
pthread_create(&tid,NULL,run,(void *)cfd);
}
return 0;
}
void *run(void *arg){
int cfd = (int ) arg;
pthread_detach(pthread_self());
char buf[1024];//缓冲区
int len,i;
while(1){
len = read(cfd,buf,sizeof(buf));
printf("receive: %s\n",buf);
if(len<=0)break;
for(i=0;i<len;++i)
buf[i] = toupper(buf[i]);
write(cfd,buf,len);
}
close(cfd);
}
客户端
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define DEST_PORT 9999//目标地址端口号
#define DEST_IP "127.32.255.2"/*目标地址IP,这里设为本机,不一定非得是127.0.0.1,只要127开头并且不是127.0.0.0和127.255.255.255即可*/
#define MAX_DATA 100//接收到的数据最大程度
int main(){
int sockfd;
struct sockaddr_in dest_addr;
char buf[MAX_DATA];
sockfd=socket(AF_INET,SOCK_STREAM,0);
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(DEST_PORT);
dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),8);
connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr));
printf("connect success");
while(1){
char send_buf[512] = "";
scanf("%s",&send_buf);
write(sockfd,send_buf,sizeof(send_buf));
read(sockfd,send_buf,sizeof(send_buf));
printf("client receive:%s\n",send_buf);
}
return 0;
}
centos执行
gcc -o server.out server.c -lpthread
gcc -o client.out client.c -lpthread
得到执行文件server.out,client.out
用xshell 对一个虚拟机开两个item窗口,一个执行./server.out ,另一个执行./client.out,可以开多个客户端通信