open_clientfd(char* hostname,int port)和open_listenfd(int port)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/wait.h>

typedef struct sockaddr SA;

int open_clientfd(char* hostname,int port)
{
    int clientfd;
    struct hostent * hp;
    struct sockaddr_in serveraddr;
    char* msg;
    
    /*创建socket*/
    if((clientfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        msg="client socket() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -1;
    }
    msg="client socket() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    /*填写server的ip地址和port*/
    if((hp=gethostbyname(hostname))==NULL)
    {
        msg="client gethostbyname() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -2;
    }
    msg="client gethostbyname() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    bzero((char*)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(port);
    bcopy((char*)hp->h_addr_list[0],(char*)&serveraddr.sin_addr.s_addr,hp->h_length);
    
    /*建立连接*/
    if(connect(clientfd,(SA*)&serveraddr,sizeof(serveraddr))<0)
    {
        msg="client connect() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -3;
    }
    msg="client connect() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    return clientfd;
}

int open_listenfd(int port)
{
    int listenfd,optval;
    struct sockaddr_in serveraddr;
    char* msg;
    
    /*创建socket*/
    if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        msg="server socket() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -1;
    }
    msg="server socket() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    /*配置服务器使得它能被立即终止和重启*/
    if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(const void *)&optval,sizeof(int))<0)
    {
        msg="server setsockopt() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -2;
    }
    msg="server setsockopt() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    /*绑定服务端的ip和端口*/
    bzero((char*)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons((unsigned short)port);
    serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
    if(bind(listenfd,(SA*)&serveraddr,sizeof(serveraddr))<0)
    {
        msg="server bind() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -3;
    }
    msg="server bind() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    /*创建listen*/
    if(listen(listenfd,1024)<0)
    {
        msg="server listen() error!\n";
        write(STDOUT_FILENO,msg,strlen(msg));
        return -3;
    }
    msg="server listen() success!\n";
    write(STDOUT_FILENO,msg,strlen(msg));
    
    return listenfd;
}

 

转载于:https://www.cnblogs.com/jiayith/p/3581215.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值