C++的Socket尝试
来源:互联网 发布:简单游戏编程 编辑:程序博客网 时间:2024/05/01 13:18
C++大作业,准备做一个即时通讯工具,查阅资料找到了Socket,迫不及待的开始了尝试,以下是我在尝试过程中遇到的一些问题,部分问题自己已经获得了答案,还有一些还不知道怎么去回答,今天就先到这里了,接下来准备去看下别人的程序,看下能否获得一些灵感。
问题1:即时通讯是样做到的?
网络分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解,IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,协议相当于通道,也就是说我们在做与网络有关的应用时,必须要按着这个通道走,而应用层相当于一个转换,毕竟计算机在传输数据时使用的是数字信息,古老一点的是电波信息,对于任何一个人来说,这些讯息是难以利用的,而应用层的功能就是将我们不懂的这些东西转换成我们可以直观的了解到的东西,比如HTTP协议以网页形式展示给我们,还有其他的例如FTP、TELNET等协议,在不同网络层上的协议是没有可比性的,而socket相当于将TCP/IP进行了封装应用,在应用上不需要对协议的具体内容进行了解,只需要懂得如何应用就可以了,在这里附上我觉得非常有价值的一片文章:http://jingyan.baidu.com/article/08b6a591e07ecc14a80922f1.html
问题2:Socket具体应该如何去实现?
以C++为例,Socket只需要通过头文件进行引入就可以直接应用,在这样的基础上,需要对Socket的具体函数进行了解,这些内容我以后会不断的贴出来,今天就先将我实现数据传输的代码奉上,Socket分为两个端口,Server端和Client端,在进行数据测试时只要在本机上同时运行这两个程序就可以完成测试。
server端:
#include <cstdio>#include <cstdlib>#include <cstring>#include <errno.h>#include <unistd.h>#include <iostream>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>using namespace std;#define MAXLINE 4096int main(int argc, char** argcv){ int listenfd, connfd; struct sockaddr_in servaddr; char buff[4096]; int n; if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("create socket error : %s(errno: %d)\n", strerror(errno), errno); return 0; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) { printf("bind socket error: %s(errno: %d)\n", strerror(errno), errno); return 0; } if((listen(listenfd, 10)) == -1) { printf("listen socket error: %s(errno: %d)\n", strerror(errno), errno); return 0; } printf("=====waiting for client's request=====\n"); int cnt = 0; while(1) { if(connfd = accept(listenfd, (struct sockaddr*)NULL, NULL) == -1) { printf("accept socket error: %s(errno: %d)\n", strerror(errno), errno); continue; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = 0; printf("recv msg from client: \n"); cout << buff; close(connfd); }clienet端:
#include <cstdio>#include <cstdlib>#include <cstring>#include <errno.h>#include <unistd.h>#include <iostream>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>using namespace std;#define MAXLINE 4096int main(int argc, char* argv[]){ int sockfd, n; char recvline[MAXLINE], sendline[MAXLINE]; struct sockaddr_in servaddr; if(argc != 2) { printf("usage:./client <ipaddress>\n"); return 0; } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error: %s(errno: %d)\n", strerror(errno), errno); return 0; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6666); if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { printf("inet_pton error for %s\n", argv[1]); return 0; } if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { printf("connect error: %s(errno: %d)\n", strerror(errno), errno); return 0; } printf("send msg to server: \n"); fgets(sendline, MAXLINE, stdin); if(send(sockfd, sendline, strlen(sendline), 0) < 0) { printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); return 0; } close(sockfd); return 0;}
以上是今天的测试结果,亲测有效。
问题3:为什么第一次启动client端不会向sever端发送数据?
问题4:如何实现多段对话,而不是发送一句后就需要关闭客户端进行重新链接?
还有很多问题等到明天进行解决。
- C++的Socket尝试
- 第一次尝试Java的Socket
- Socket(二)尝试多线程的服务端
- 重新对c的尝试
- C宏的使用尝试
- 尝试 php socket
- 聊天室(Socket)尝试中所遇到的问题
- 尝试封装socket 对this指针的猜想
- C语言中面向对象的尝试
- C语言:泛型栈的一次尝试
- websocket 连接 C Server的尝试
- websocket 连接 C Server的尝试
- websocket 连接 C Server的尝试
- websocket 连接 C Server的尝试
- 使用C算法封装盒子的尝试
- Python中socket初次尝试
- Socket的建立 c#
- C语言中面向对象的尝试 (转载)
- Centos安装metasploit
- 杭电 1012 u Calculate e
- 服务器通过浏览器下载文件到本地
- Java 转换成ObjectC代码
- 99乘法表
- C++的Socket尝试
- 想要开发好的软件,必须学会这几项!
- 判断浏览器版本
- mysql 定时任务编写分类
- SSH之Spring
- Feekood基本语法(5)-- 动画
- Linux-hexdump命令详解
- Xcconfig文件的用法
- cocos2d-x android真机运行读取文件 报 Fatal signal 11 (SIGSEGV) at 0xdeadaad (code=1), thread 20446 (Thread-12