给大家分享一下学习服务器编程的基础 socket通信的案例 使用C语言
创建服务端文件
vi server.c
开始写我们的服务端代码
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#define SERVER_PORT 666 //宏定义端口号
int main(void)
{
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; //选择协议族 IPv4
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //监听所有本地IP
server_addr.sin_port = htons(SERVER_PORT); //绑定端口号
// 实现服务器标签贴到信箱
bind(sock,(struct sockaddr *)&server_addr,sizeof(server_addr) );
//监听
listen(sock,128);
printf("等待客户端的链接\n");
int done=1;
while(done)
{
struct sockaddr_in client;
int client_sock,len;
char client_ip[64];
char buff[256];
socklen_t client_addr_len;
client_addr_len=sizeof(client);
client_sock = accept(sock,(struct sockaddr *)&client,&client_addr_len);
//打印客户端地址和端口号
printf("client ip: %s\t port: %d\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,client_ip,sizeof(client_ip)),ntohs(client.sin_port));
// 读取客户端发送的数据
len = read(client_sock,buff,sizeof(buff)-1);
buff[len] = '\0';
printf("recive[%d]:%s\n",len,buff);
len = write(client_sock,buff,len);
printf("write finished. len: %d\n",len);
close(client_sock);
}
return 0;
}
创建客户端:
vi client.c
客户端代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1" //本地客户端的ip
int main(int argc,char *argv[])
{
int sockfd;
char *message;
struct sockaddr_in servaddr;
int n;
char buff[64];
if(argc != 2) //处理异常参数
{
fputs("usage: ./echo_client message \n",stderr);
exit(1);
}
message= argv[1];
printf("message: %s\n",message);
sockfd = socket(AF_INET,SOCK_STREAM,0);
memset(&servaddr,'\0',sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,SERVER_IP,&servaddr.sin_addr);
servaddr.sin_port = htons(SERVER_PORT);
connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
write(sockfd,message,strlen(message));
n = read(sockfd,buff,sizeof(buff)-1);
if(n>0)
{
buff[n]='\0';
printf("receive: %s\n",buff);
}else
{
perror("error!!!");
}
printf("finisned.\n");
close(sockfd);
return 0;
}
使用gcc编译客户端和服务器端代码:
gcc server.c -o server
gcc client.c -o client
运行客户端和服务端的代码
./server
运行服务端 等待客户端连接
./client “This is a test”
客户端运行成功 成功给服务端发送信息
服务器端接收成功 给客户端返回信息