这是最典型的client server通信代码,网上实例很多,但大部分无法编译通过(囧)
服务器端代码:
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
int main(){
int server_fp=socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in s_add;
bzero(&s_add,sizeof(struct sockaddr_in));
//服务器端的监听端口2013
s_add.sin_family=AF_INET;
s_add.sin_port=htons(2013);
bind(server_fp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr));
listen(server_fp,15);
printf("begin\n");
int sin_size=sizeof(struct sockaddr_in);
sockaddr_in c_add;
//接收客户端请求,得到了fd就得到了一切!
int fd=accept(server_fp, (struct sockaddr *)(&c_add), (socklen_t*)&sin_size);
printf("end %s\n",inet_ntoa(c_add.sin_addr));
char receive[100];
int len=read(fd,receive,100);
printf("%d %s\n",len,receive);
close(fd);
close(server_fp);
return 0;
}
客户端代码:
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
int main(){
int fd=socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in s_add;
bzero(&s_add,sizeof(struct sockaddr_in));
//设置服务器端地址
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr= inet_addr("127.0.0.1");
s_add.sin_port=htons(2013);
//连接服务器,得到fd后 网络部分结束了,剩下的是收发数据
int ret=connect(fd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr));
printf("%d\n",ret);
char str[]="hello world";
write(fd,str,sizeof(str));
close(fd);
return 0;
}
运行命令
g++ -o server server.cpp
g++ -o client client.cpp
编译成功后,
执行
./server
程序会停在accept
此时
./client
server端输出:
begin
end 127.0.0.1
12 hello world
后续希望在客户端与服务器之间传递protobuf数据,还没调试好,而且服务器需要增加线程池等,还没调好,请期待!