功能描述
利用TCP网络通信实现客户端和服务器的通信
服务器代码
server.c
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#include <arpa/inet.h>#define LINE10//创建TCP服务器实现服务器和客户端的通信int main(){//创建socket套接字int serfd=0;serfd=socket(AF_INET,SOCK_STREAM,0);if(serfd<0){perror("socket failed");return -1;}printf("socket ok!\n");//通过调用bind绑定IP地址和端口号int ret=0;struct sockaddr_in seraddr={0};seraddr.sin_family=AF_INET;seraddr.sin_port=htons(8888);seraddr.sin_addr.s_addr=inet_addr("192.168.59.131");ret=bind(serfd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(ret<0){perror("bind failed");close(serfd);return -1;}printf("bind success\n");//通过调用listen将套接字设置为监听模式int lis=0;lis=listen(serfd,LINE);if(lis<0){perror("listen failed");close(serfd);return -1;}printf("listen success\n");//服务器等待客户端连接中,游客户端连接时调用accept产生一个新的套接字int confd=0;socklen_t addrlen;struct sockaddr_in clientaddr={0};addrlen=sizeof(clientaddr);confd=accept(serfd,(struct sockaddr *)&clientaddr,&addrlen);if(confd<0){perror("accept failed");close(serfd);return -1;}printf("connect success!\n");printf("ip=%s,port=%u\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));//调用recv接收客户端的消息while(1){int rev=0;int sed=0;char buf[1024]={0};rev=recv(confd,buf,sizeof(buf),0);if(rev>0){printf("本次收到了%d个字节\n",rev);printf("receive: %s\n",buf);}memset(buf,0,sizeof(buf));gets(buf);sed=send(confd,buf,strlen(buf),0);if(sed<0){perror("send failed");close(serfd);return -1;}printf("send success\n");}close(confd);close(serfd);return 0;}
客户端代码
client.c
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>//创建TCP服务器实现服务器和客户端的通信int main(){//创建socket套接字int clientfd=0;clientfd=socket(AF_INET,SOCK_STREAM,0);if(clientfd<0){perror("socket failed");return -1;}printf("socket ok!\n");//客户端可以不绑定IP地址和端口号,系统会随机分配//客户端连接服务器int ret=0;int addrlen=0;struct sockaddr_in seraddr={0};seraddr.sin_family=AF_INET;seraddr.sin_port=htons(8888);seraddr.sin_addr.s_addr=inet_addr("192.168.59.131");addrlen=sizeof(seraddr);ret=connect(clientfd,(struct sockaddr *)&seraddr,addrlen);if(ret<0){perror("connect failed");close(clientfd);return -1;}printf("connect success\n");//调用send向服务器发送消息while(1){int sed=0;int rev=0;char buf[1024]={0};gets(buf);sed=send(clientfd,buf,strlen(buf),0);if(sed<0){perror("send failed");close(clientfd);return -1;}printf("send success\n");memset(buf,0,sizeof(buf));rev=recv(clientfd,buf,sizeof(buf),0);if(rev>0){printf("本次收到了%d个字节\n",rev);printf("receive: %s\n",buf);}}close(clientfd);return 0;}
注意
使用时需要将其中的IP地址换成自己的IP,不然无法成功连接。或者改为本地回环地址。