此项目分为客户端和服务器端
运行环境(Ubuntu16.04)
最终效果:客户端向服务器端发送数据(这里用一句英语展示),服务器端收到响应给客户端返回数据(英语大写变小写)。
服务器端
#include<stdio.h>
#include<ctype.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<arpa/inet.h>
#define SERVER_PORT 666
int main(){
int sock;
struct sockaddr_in server_addr;
sock=socket(AF_INET,SOCK_STREAM,0);
//清空数据
bzero(&server_addr,sizeof(server_addr));
//结构体初始化
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定
bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
//监听
listen(sock,128);
printf("等待客户端连接...\n");
int done = 1;
while(done){
struct sockaddr_in client_addr;
int sock_client,client_port,len,i;
char ip[64],buf[256];
socklen_t client_addr_len;//用于保存客户端的结构体的大小
client_addr_len=sizeof(client_addr);
//客户端接受的是服务器端的信息
sock_client = accept(sock,(struct sockaddr*)&client_addr,&client_addr_len);
inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, ip, sizeof(ip));
client_port = ntohs(client_addr.sin_port);
printf("client ip: %s\t port : %d\n",ip,client_port);
//读取客户端发来的信息
len = read(sock_client,buf,sizeof(buf)-1);
buf[len]='\0';
printf("receive[%d]: %s\n",len,buf);
//大写转小写
for(i=0;i<len;i++){
if(buf[i]>='A'&&buf[i]<='Z'){
buf[i] = toupper(buf[i]);
}
}
len = write(sock_client,buf,len);
printf("finished len: %d, data: %s\n",len,buf);
close(sock_client);
}
close(sock);
return 0;
}
客户端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1"
int main(int argc,char* argv[]){
int sock,n;
char* message;
char buf[256];
struct sockaddr_in client_addr;
if(argc!=2){
printf("input error\n");
return 0;
}
message = argv[1];
printf("message: %s\n", argv[1]);
sock=socket(AF_INET,SOCK_STREAM,0);
//清空内容
memset(&client_addr,'\0',sizeof(struct sockaddr_in));
inet_pton(AF_INET,SERVER_IP,&client_addr.sin_addr.s_addr);
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(SERVER_PORT);
//发送连接
connect(sock,(struct sockaddr*)&client_addr,sizeof(client_addr));
//连接之后写消息
write(sock,message,strlen(message));
//-1是因为最后一个字节要保证是'\0';
n=read(sock,buf,sizeof(buf)-1);
if(n>0){
buf[n]='\0';
printf("receive: %s\n",buf);
}else{
printf("error!!!\n");
}
printf("finished\n");
close(sock);
return 0;
}
我提前已经编译,这里我直接开启服务器端,如图
我在客户端向服务器端发送数据(“hello LINUX!”),就会接收到来自服务器端的数据(“hello linux!”)。
然后服务器端也会收到我们客户端发送的数据。
这是一个很简单的小项目,大家可以拿去练手。