马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
头脑导图
TCP实现跨主机通讯
服务器端
- #include<myhead.h>
- #define SER_PORT 6666 //端口号
- #define SER_IP "192.168.0.108" //服务器IP
- 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");
- //端口快速重用
- int reuse = 1;
- if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
- {
- perror("setsockopt error");
- return -1;
- }
- //绑定
- 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");
- return -1;
- }
- printf("bind success\n");
- //监听
- if(listen(sfd,128)==-1)
- {
- perror("listen error");
- return -1;
- }
- printf("listen success\n");
- //接收客户端
- int newfd = -1;
- struct sockaddr_in cin;
- socklen_t addrlen = sizeof(cin);
- if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen))==-1)
- {
- perror("accept error");
- return -1;
- }
- printf("监听到客户端\n");
- //数据收发
- char buf[128] = "";
- while(1)
- {
- //清空内容
- bzero(&buf,sizeof(buf));
- //接收客户端消息
- int res = recv(newfd,buf,sizeof(buf),0);
- if(res == -1)
- {
- perror("recv error");
- return -1;
- }else if(res = 0||strcmp(buf,"quit")==0)
- {
- printf("客户端已退出\n");
- close(newfd);
- break;
- }
- printf("[%s:%d]接收到的消息为:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
- //向客户端回复消息
- printf("请输入你的回复\n");
- bzero(&buf,sizeof(buf));
- fgets(buf,sizeof(buf),stdin);
- buf[strlen(buf)-1] = 0;
- send(newfd,buf,strlen(buf),0);
- printf("发送成功\n");
- }
- //关闭文件
- close(sfd);
- return 0;
- }
复制代码 客户端
- ubuntu@ubuntu:test$ cat 02tcpcil.c
- #include<myhead.h>
- #define SER_PORT 6666
- #define SER_IP "192.168.0.108"
- #define CIL_PORT 8888
- #define CIL_IP "192.168.0.108"
- int main(int argc, const char *argv[])
- {
- //创建用于通信的套接字文件
- int cfd = -1;
- if((cfd = socket(AF_INET,SOCK_STREAM,0))==-1)
- {
- perror("socket error");
- return -1;
- }
- printf("socket success\n");
- //端口号快速重用
- int reuse = 1;
- if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
- {
- perror("setsockopt error");
- return -1;
- }
- //绑定ip和端口号
- struct sockaddr_in cin;
- cin.sin_family = AF_INET;
- cin.sin_port = htons(CIL_PORT);
- cin.sin_addr.s_addr = inet_addr(CIL_IP);
- if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
- {
- perror("bind error");
- return -1;
- }
- printf("bind success\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(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
- {
- perror("connect error");
- return -1;
- }
- printf("连接到服务器\n");
- //收发信息
- char buf[128] = "";
- while(1)
- {
- //向服务端输入消息
- printf("请输入>>>");
- fgets(buf,sizeof(buf),stdin);
- buf[strlen(buf)-1] = 0;
- send(cfd,buf,strlen(buf),0);
- if(strcmp(buf,"quit")==0)
- {
- break;
- }
- //清空容器
- bzero(&buf,sizeof(buf));
- //接收服务器消息
- recv(cfd,buf,sizeof(buf),0);
- printf("%s\n",buf);
- }
- //关闭文件
- close(cfd);
- return 0;
- }
复制代码 UDP实现跨主机通讯
服务器端
- #include<myhead.h>
- #define SER_PORT 7777 //服务器端口号
- #define SER_IP "192.168.0.128" //服务器ip地址
- int main(int argc, const char *argv[])
- {
- //创建套接字文件
- int sfd = socket(AF_INET,SOCK_DGRAM,0);
- if(sfd == -1)
- {
- perror("socket error");
- return -1;
- }
- printf("sfd = %d\n",sfd); //3
- //将端口号快速重用
- int reuse = 1;
- if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
- {
- perror("setsockopt error");
- return -1;
- }
- printf("端口号快速重用成功\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");
- return -1;
- }
- printf("bind success\n");
- //数据收发
- char buf[128] = "";
- struct sockaddr_in cin; //接受对端地址信息
- socklen_t addrlen = sizeof(cin); //接受地址长度
- while(1)
- {
- //清空容器
- bzero(buf,sizeof(buf));
- //从套接字中读取数据
- recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
- printf("收到消息为:%s\n",buf);
- strcat(buf,"*==*");
- if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,sizeof(cin))==-1)
- {
- perror("sendto error");
- return -1;
- }
- printf("发送成功\n");
- }
- //关闭文件描述符
- close(sfd);
- return 0;
- }
复制代码 客户端
- #include<myhead.h>
- #define SER_PORT 7777 //服务器端口号
- #define SER_IP "192.168.0.128" //服务器ip地址
- #define CLI_PORT 5555 //客户端端口号
- #define CLI_IP "192.168.0.128" //客户端地址
- int main(int argc, const char *argv[])
- {
- //创建套接字文件
- int cfd = socket(AF_INET,SOCK_DGRAM,0);
- if(cfd == -1)
- {
- perror("socket error");
- return -1;
- }
- printf("cfd = %d\n",cfd); //3
- //将端口号快速重用
- int reuse = 1;
- if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
- {
- perror("setsockopt error");
- return -1;
- }
- printf("端口号快速重用成功\n");
- //绑定IP地址和端口号
- //填充地址信息结构体
- struct sockaddr_in cin;
- cin.sin_family = AF_INET; //通信域
- cin.sin_port = htons(CLI_PORT); //端口号
- cin.sin_addr.s_addr = inet_addr(CLI_IP); //ip地址
- //绑定工作
- if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
- {
- perror("bind error");
- return -1;
- }
- printf("bind success\n");
- //数据收发
- char buf[128] = "";
- struct sockaddr_in sin; //接受对端地址信息
- sin.sin_family = AF_INET;
- sin.sin_port = htons(SER_PORT);
- sin.sin_addr.s_addr = inet_addr(SER_IP);
- while(1)
- {
- //清空容器
- bzero(buf,sizeof(buf));
- //从终端获取数据
- printf("请输入>>>>");
- fgets(buf,sizeof(buf),stdin);
- buf[strlen(buf)-1] = 0;
- //将数据发送给服务器
- sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin));
- printf("发送成功\n");
- //清空容器
- bzero(buf,sizeof(buf));
- //接受服务器发来的消息
- recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
- printf("收到来自服务器的消息:%s\n",buf);
- }
- //关闭文件描述符
- close(cfd);
- return 0;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |