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:如何实现多段对话,而不是发送一句后就需要关闭客户端进行重新链接?

还有很多问题等到明天进行解决。

0 0
原创粉丝点击