文章目录
- 一、思维导图
- 二、基于TCP通信的服务器端和客户端实现
- 三、牛客网刷题
一、思维导图

二、基于TCP通信的服务器端和客户端实现
1、myhead.h
#ifndef __MYHEAD_H__
#define __MYHEAD_H__#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>#define ERR_MSG(msg) do{perror(msg);printf("%d\n",__LINE__);return -1;}while(0)
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#endif
2、服务器端
#include <myhead.h>#define SER_PORT 8888
#define SER_IP "192.168.116.128"int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){ERR_MSG("socket error");}printf("socket success sfd=%d\n",sfd);int reuse=-1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){ERR_MSG("setsockopt error");}printf("端口快速重启成功\n");struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("bind error");}printf("bind success\n");if(listen(sfd,128)==-1){ERR_MSG("listen error");}printf("listen success\n");struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);int new_fd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(-1==new_fd){ERR_MSG("accept error");}printf("[%s,%d]发来连接,new_fd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),new_fd);while(1){char rbuf[128]="";int res=read(new_fd,rbuf,sizeof(rbuf)-1);if(res==0){printf("客户端已下线\n");close(new_fd);break;}if(res==-1){close(new_fd);close(sfd);ERR_MSG("read error");}printf("[%s,%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);strcat(rbuf,"*_*");write(new_fd,rbuf,strlen(rbuf));printf("发送成功\n");}close(sfd);return 0;
}
3、客户端
#include <myhead.h>#define SER_PORT 8888
#define SER_IP "192.168.116.128"int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){ERR_MSG("socket error");}printf("socket success sfd=%d\n",sfd);struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("conect error");}printf("connect success\n");while(1){char wbuf[128]="";fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';if(strcmp(wbuf,"quit")==0){break;}write(sfd,wbuf,strlen(wbuf));printf("发送成功\n");read(sfd,wbuf,sizeof(wbuf));printf("收到的消息为%s\n",wbuf);}close(sfd);return 0;
}
三、牛客网刷题
