加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux网络编程之socket(七) 一个进程发起多个连接和gethostbyname等函数

发布时间:2013-09-14 20:35:19 所属栏目:Linux 来源:站长网
导读:一、在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就 可以让一个客户端发起多个连接,然后只利用其
一、在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就 可以让一个客户端发起多个连接,然后只利用其中一个连接发送数据。

先来认识一个函数getsockname

 #include <sys/socket.h>

 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

利用此函数可以得到某连接sockfd的地址信息,如ip地址和端口,这可以帮助我们判断发起了多少个连 接。

我们假设一个客户端发起了5个连接,如下图:

此时根据以前说过的fork程序,服务器端会产生5个子进程对其进行服务。

修改过后的客户端程序如下:

/*************************************************************************
    > File Name: echoser.c
    > Author: Simba
    > Mail: dameng34@163.com
    > Created Time: Fri 01 Mar 2013 06:15:27 PM CST
 ************************************************************************/
    
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include "read_write.h"
    
#define ERR_EXIT(m) 
    do { 
        perror(m); 
        exit(EXIT_FAILURE); 
    } while (0)
    
void do_echocli(int sock)
{
    
    char sendbuf[1024] = {0};
    char recvbuf[1024] = {0};
    
    while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
    {
    
    
        writen(sock, sendbuf, strlen(sendbuf));
    
        int ret = readline(sock, recvbuf, sizeof(recvbuf)); //按行读取
        if (ret == -1)
            ERR_EXIT("read error");
        else if (ret  == 0)   //服务器关闭
        {
            printf("server closen");
            break;
        }
    
        fputs(recvbuf, stdout);
    
        memset(sendbuf, 0, sizeof(sendbuf));
        memset(recvbuf, 0, sizeof(recvbuf));
    
    }
    
    close(sock);
}
    
int main(void)
{
    int sock[5];
    int i;
    for (i = 0; i < 5; i++)
    {
        if ((sock[i] = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
            //  listenfd = socket(AF_INET, SOCK_STREAM, 0)
            ERR_EXIT("socket error");
    
        struct sockaddr_in servaddr;
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(5188);
        servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        /* inet_aton("127.0.0.1", &servaddr.sin_addr); */
    
        if (connect(sock[i], (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
            ERR_EXIT("connect error");
    
        struct sockaddr_in localaddr;
        socklen_t addrlen = sizeof(localaddr);
        if (getsockname(sock[i], (struct sockaddr *)&localaddr, &addrlen) < 0)
            ERR_EXIT("getsockname error");
        /* getpeername()获取对等方的地址 */
        printf("local ip=%s port=%dn", inet_ntoa(localaddr.sin_addr),
               ntohs(localaddr.sin_port));
    }
    /* 一个进程也可以发起多个socket连接,因为每次的端口号都不同 */
    do_echocli(sock[0]); //发起5个套接字连接,但只借助第一个套接口通信
    
    return 0;
}

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读