⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux网络编程一步一步学-异步通讯聊天程序select(15).txt

📁 linux socket编程很好的学习文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:
*********************************************************************/
int main(int argc, char **argv)
{
    int sockfd, len;
    struct sockaddr_in dest;
    char buffer[MAXBUF + 1];
    fd_set rfds;
    struct timeval tv;
    int retval, maxfd = -1;

    if (argc != 3) {
        printf
            ("参数格式错误!正确用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用来从某个 IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息",
             argv[0], argv[0]);
        exit(0);
    }
    /* 创建一个 socket 用于 tcp 通信 */
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket");
        exit(errno);
    }

    /* 初始化服务器端(对方)的地址和端口信息 */
    bzero(&dest, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_port = htons(atoi(argv[2]));
    if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
        perror(argv[1]);
        exit(errno);
    }

    /* 连接服务器 */
    if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
        perror("Connect ");
        exit(errno);
    }

    printf
        ("\n准备就绪,可以开始聊天了……直接输入消息回车即可发信息给对方\n");
    while (1) {
        /* 把集合清空 */
        FD_ZERO(&rfds);
        /* 把标准输入句柄0加入到集合中 */
        FD_SET(0, &rfds);
        maxfd = 0;
        /* 把当前连接句柄sockfd加入到集合中 */
        FD_SET(sockfd, &rfds);
        if (sockfd > maxfd)
            maxfd = sockfd;
        /* 设置最大等待时间 */
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        /* 开始等待 */
        retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
        if (retval == -1) {
            printf("将退出,select出错! %s", strerror(errno));
            break;
        } else if (retval == 0) {
            /* printf
               ("没有任何消息到来,用户也没有按键,继续等待……\n"); */
            continue;
        } else {
            if (FD_ISSET(sockfd, &rfds)) {
                /* 连接的socket上有消息到来则接收对方发过来的消息并显示 */
                bzero(buffer, MAXBUF + 1);
                /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */
                len = recv(sockfd, buffer, MAXBUF, 0);
                if (len > 0)
                    printf
                        ("接收消息成功:'%s',共%d个字节的数据\n",
                         buffer, len);
                else {
                    if (len < 0)
                        printf
                            ("消息接收失败!错误代码是%d,错误信息是'%s'\n",
                             errno, strerror(errno));
                    else
                        printf("对方退出了,聊天终止!\n");
                    break;
                }
            }
            if (FD_ISSET(0, &rfds)) {
                /* 用户按键了,则读取用户输入的内容发送出去 */
                bzero(buffer, MAXBUF + 1);
                fgets(buffer, MAXBUF, stdin);
                if (!strncasecmp(buffer, "quit", 4)) {
                    printf("自己请求终止聊天!\n");
                    break;
                }
                /* 发消息给服务器 */
                len = send(sockfd, buffer, strlen(buffer) - 1, 0);
                if (len < 0) {
                    printf
                        ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n",
                         buffer, errno, strerror(errno));
                    break;
                } else
                    printf
                        ("消息:%s\t发送成功,共发送了%d个字节!\n",
                         buffer, len);
            }
        }
    }
    /* 关闭连接 */
    close(sockfd);
    return 0;
}
 
编译用如下命令:
gcc -Wall async-server.c -o server
gcc -Wall async-client.c -o client
运行用如下命令:
./server 7838 1
./client 127.0.0.1 7838



【作者: 周立发】【访问统计:4414】【2007年01月25日 星期四 21:31】【注册】【打印】 

Google Adsense
CSP Sockets by Aries
Std. & Custom CSP Sockets For BGA & CSP devices 0.5mm and up 
http://www.arieselec.com/
 
搜索
            
Trackback
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=6068027 

来自《通往圣地》卫斯文的《通往圣地》卫斯文的引用:


《通往圣地》卫斯文
回复
 - 评论人:周立发   2008-10-27 12:22:17      
只要不与man connect看到的相冲突,我认为都是对的。各种方法只是大家编程序的风格,就没必要都一样了。

 
 - 评论人:寻找   2008-10-23 09:59:41      
多谢楼主分享!学习学习!! 
我现在也正在写一个Linux下的聊天程序,在实现用户私聊方面遇到困难,就是如何区分不同的客户端,我考虑过自己写一个结构体等等,现在还没有解决,看了楼主的文章,收获不少。 
connect()函数执行成功时返回的是0,失败时返回-1,楼主的客户端代码中 
/* 连接服务器 */ 
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) { 
perror("Connect "); 
exit(errno); 
} 
判断连接是否成功应该是 if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) == 0),或者 if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != -1),你觉得呢?

 
 - 评论人:寻找   2008-10-23 09:57:15      
多谢楼主分享!学习学习!! 
我现在也正在写一个Linux下的聊天程序,在实现用户私聊方面遇到困难,就是如何区分不同的客户端,我考虑过自己写一个结构体等等,现在还没有解决,看了楼主的文章,收获不少。 
connect()函数执行成功时返回的是0,失败时返回-1,楼主的客户端代码中 
/* 连接服务器 */ 
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) { 
perror("Connect "); 
exit(errno); 
} 
判断连接是否成功应该是 if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) == 0),或者 if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != -1),你觉得呢?

 
 - 评论人:jolon.chan   2008-10-12 00:22:18      
这程序作为示例还不错!但作为商业用途还差很远,里头很多语句的写法效率都不太高哦:)

 
 - 评论人:lf   2008-08-05 10:17:05      
另外问个问题 怎样实现connect非阻塞呢 可以告诉我吗

 
 - 评论人:lf   2008-08-05 10:15:51      
从来不留言的 看到这么好的东西 我破例了

 
 - 评论人:mark   2008-07-29 16:40:33      
写得挺好,很多我都没看懂!!??

 
 - 评论人:mark   2008-07-29 16:40:32      
写得挺好,很多我都没看懂!!??

 
 - 评论人:mark   2008-07-29 16:40:26      
写得挺好,很多我都没看懂!!

 
 - 评论人:agan   2008-06-10 21:30:11      
不错,对周大哥表示感谢...

 
 - 评论人:周立发   2007-03-26 18:28:05      
不客气,有啥问题直接发邮件到 zhoulifa@163.com ,我尽力及时回复各位,多多交流、共同进步!

 
 - 评论人:hwz_119   2007-03-19 22:29:04      
学习,希望能和你交流

 
 - 评论人:zgqmm   2007-02-25 10:14:21      
您的精神可贵,学习着。。。。

 
 - 评论人:小鋅   2007-02-16 16:27:43      
非常感謝您有這樣的胸襟,提供自己的所學造福大眾,希望將來我也能跟您一樣

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -