练习1:
实现tcp的服务端客户端通信
1.服务端.c#include <myhead.h> #define SER_IP "192.168.0.113" #define SER_PORT 8888 int main(int argc, const char *argv[]) { //建立套接字端点 int sfd=socket(AF_INET,SOCK_STREAM,0); if(sfd==-1){ perror("socket error"); return -1; } printf("socket success\n"); //填充服务端ip地址以及端口号 struct sockaddr_in sin; sin.sin_family=AF_INET;/*通信类别*/ sin.sin_port=htons(SER_PORT);/*主机端口字节序为网络字节序*/ sin.sin_addr.s_addr=inet_addr(SER_IP);/*主机ip转换为整数*/ //绑定 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ perror("bind error"); goto _EXIT; } printf("bind success\n"); //监听 if(listen(sfd,128)==-1){ perror("listen error"); goto _EXIT; } printf("listen success\n"); //等待连接 //创建新的信息结构体用于通信 struct sockaddr_in cin; socklen_t len=sizeof(cin); int new_sfd=accept(sfd,(struct sockaddr *)&sin,&len); if(new_sfd==-1){ perror("accept error\n"); goto _EXIT; } printf("[%s:%d]accept success\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port)); //数据接收\返回 char rbuf[128]=""; while(1){ bzero(rbuf,sizeof(rbuf));/*初始化字符数组*/ int retval=recv(new_sfd,rbuf,sizeof(rbuf),0); if(retval==0){ perror("recv error"); break; } printf("已成功接收:%s\n",rbuf); strcat(rbuf,":"); if(send(new_sfd,rbuf,strlen(rbuf),0)==-1){ perror("send error"); goto _EXIT; } printf("发送成功\n"); } printf("客户端已断开连接\n"); _EXIT: close(sfd); close(new_sfd); return 0; }
客户端.c
#include <myhead.h> #define SER_IP "192.168.0.113" #define SER_PORT 8888 int main(int argc, const char *argv[]) { //建立套接字端点 int sfd=socket(AF_INET,SOCK_STREAM,0); if(sfd==-1){ perror("socket error"); return -1; } printf("socket success\n"); //填充需要链接的服务端ip地址以及端口号 struct sockaddr_in sin; sin.sin_family=AF_INET;/*通信类别*/ sin.sin_port=htons(SER_PORT);/*主机端口字节序为网络字节序*/ sin.sin_addr.s_addr=inet_addr(SER_IP);/*主机ip转换为整数*/ //讲给定的套接字链接到给定的地址信息主机上 if(connect(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){ perror("connect error"); goto _EXIT; } printf("connect success\n"); //数据接收\发送 char rbuf[128]=""; char wbuf[128]=""; while(1){ bzero(rbuf,sizeof(rbuf));/*初始化字符数组*/ bzero(wbuf,sizeof(wbuf)); fgets(wbuf,sizeof(wbuf),stdin); wbuf[strlen(wbuf)-1]=0; if(send(sfd,wbuf,strlen(wbuf),0)==-1){ perror("send error"); goto _EXIT; } printf("发送成功\n"); if(recv(sfd,rbuf,sizeof(rbuf),0)==-1){ perror("recv error"); goto _EXIT; } printf("接收成功:%s\n",rbuf); } _EXIT: close(sfd); return 0; }
练习2:
实现UDP客户端服务端通信
服务端.c
#include <myhead.h> #define SRE_PORT 9999 #define SRE_IP "192.168.125.140" int main(int argc, const char *argv[]) { int cfd =socket(AF_INET,SOCK_DGRAM,0); if(cfd==-1){ perror("socket error"); return -1; } printf("socket success\n"); struct sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_port=htons(SRE_PORT); sin.sin_addr.s_addr=inet_addr(SRE_IP); if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ perror("bind error"); return -1; } char rbuf[128]=""; socklen_t nsin=sizeof(sin); while(1){ bzero(rbuf,sizeof(rbuf)); recvfrom(cfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,&nsin); printf("------%s\n",rbuf); strcat(rbuf,"*_*"); if(sendto(cfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&sin,sizeof(sin))==-1){ perror("sendto error"); return -1; } printf("sendto success\n"); } close(cfd); return 0; }
客户端.c
#include <myhead.h> #define SRE_PORT 9999 #define SRE_IP "192.168.125.140" int main(int argc, const char *argv[]) { int cfd =socket(AF_INET,SOCK_DGRAM,0); if(cfd==-1){ perror("socket error"); return -1; } printf("socket success\n"); struct sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_port=htons(SRE_PORT); sin.sin_addr.s_addr=inet_addr(SRE_IP); char rbuf[128]=""; char wbuf[128]=""; while(1){ bzero(rbuf,sizeof(rbuf)); bzero(wbuf,sizeof(wbuf)); fgets(wbuf,sizeof(wbuf),stdin); wbuf[strlen(wbuf)-1]=0; if(sendto(cfd,wbuf,strlen(wbuf),0,(struct sockaddr*)&sin,sizeof(sin))==-1){ perror("sendto error"); return -1; } printf("sendto success\n"); if(recvfrom(cfd,rbuf,sizeof(rbuf),0,NULL,NULL)==-1){ perror("recvfrom error"); return -1; } printf("recvfrom success:%s\n",rbuf); } close(cfd); return 0; }